Skip to content

隐式转换

转换规则

转换前类型转换前值转换后 Boolean转换后 Number转换后 String
Booleantrue-1"true"
Booleanfalse-0"false"
Number123true-"123"
NumberInfinitytrue-"Infinity"
Number0false-"0"
NumberNaNfalse-"NaN"
String""false0-
String"123"true123
String"123musi"trueNaN
String"Musi"true,NaN
SymbolSymbol()trueTypeErrorTypeError
Nullnullfalse0"null"
Undefinedundefinedfalse0"undefined"
Functionfunction(){}trueNaN"function(){}"
Object{}trueNaN"[object Object]"
Array[]true0""
Array[123]trueNaN"1,2,3"
Array[123, "musi"]trueNaN"123,musi"

if语句和逻辑语句

如果只有单个变量,会先将变量转换为Boolean

数学运算符

  1. + 号外的数学运算符,会先把非 Number 类型的转换为 Number 类型

  2. 当数学运算符是 +

    • 当有一侧是 String 类型,会先将另一侧转换为 String 类型,然后进行字符串拼接
    • 当一侧为 Number 类型,另一侧为原始类型,则把原始类型转换为 Number 类型
    • 当一侧为 Number 类型,另一侧为原始类型,则把两侧都转为 String 类型,后进行字符串拼接

==

  1. NaN 和任何类型比较都为 false,包括他自己

  2. Boolean和其他任何类型比较,Boolean首先被转换为Number类型

    js
    true == 1  // true 
    true == '2'  // false
    true == ['1']  // true
  3. StringNumber比较,先将String转换为Number类型

    js
    123 == '123' // true
    '' == 0 // true
  4. null == undefined 比较结果是 true,除此之外,nullundefined 和其他任何结果的比较值都为 false

    js
    null == undefined // true
    null == '' // false
    undefined == false // false
  5. 当原始类型和引用类型做比较时,对象类型会依照ToPrimitive规则转换为原始类型

    • 转换为 Number,则先调用valueOf,再调用toString
    • 转换为String类型,先调用toString,再调用valueOf
    js
     '[object Object]' == {} // true
     '1,2,3' == [1, 2, 3] // true

    ! 优先级高,先把 ![] 转换为 falsefalseBoolean 类型,转换为 Number,为 0,则 [] 调用 valueOf 转换为 0,所以为 true

    js
    [] == ![] // true

    一道有意思的面试题

    如何让:a == 1 && a == 2 && a == 3

    js
    const a = {
       value:[3,2,1],
       valueOf: function () {return this.value.pop(); },
    }