序曲

JavaScript 期望使用一个比如布尔值的时候,会对数值进行转换,真值会被当成 true,假值会被当成 false。其他情况,JavaScript 引擎会根据上下文需要对其进行必要的转换

类型转换

表:JavaScript 类型转换

转换为:字符串 数字 布尔值 对象
undefined “undefined” NaN false throws TypeError
null “null” 0 false throws TypeError
true “true” 1 new Boolean(true)
false “false” 0 new Boolean(false)
“”(空字符串) 0 false new String(“”)
“1.2”(非空,数字) 1.2 true new String(“1.2”)
“one”(非空,非数字) NaN true new String(“one”)
0 “0” false new Number(0)
-0 “0” false new Number(-0)
NaN “NaN” false new Number(NaN)
Infinity “Infinity” true new Number(Infinity)
-Infinity “-Infinity” true new Number(-Infinity)
1(无穷大,非零) “1” true new Number(1)
{}(任意对象) true
[](任意数组) “” 0 true
[9](1个数字对象) “9” 9 true
[‘a’](其他数组) 使用 join() 方法 NaN true
function(){}(任意函数) NaN true

是非(真假值)判断

任意 JavaScript 的值都可以转换为布尔值。以下值会被转换为 false

  • undefined

  • null

  • 0

  • -0

  • NaN

  • "" // 空字符串

所有其他值,包括所有对象(数组)都会被转换成 true

相等比较

相等比较包含隐式转换逻辑,比较运算 x==y, 其中 xy 是值,产生 true 或者 false。这样的比较按如下方式进行:

  1. Type(x)Type(y) 相同, 则
  1. Type(x)Undefined(同为 Undefined), 返回 true

  2. Type(x)Null(同为 Null), 返回 true

  3. Type(x)Number, 则

  1. 1. `x` `NaN` 返回 `false`
  2. 2. `y` `NaN` 返回 `false`
  3. 3. `x` `y` 为相等数值, 返回 `true`
  4. 4. `x` `+0` `y` `−0` 返回 `true`
  5. 5. `x` `−0` `y` `+0` 返回 `true`
  6. 6. 返回 `false`
  1. Type(x)String, 则当 xy 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false

  2. Type(x)Boolean, 当 xy 为同为 true 或者同为 false 时返回 true。 否则, 返回 false

  3. xy 为引用同一对象时返回 true。否则,返回 false

  1. xnullyundefined, 返回 true

  2. xundefinedynull, 返回 true

  3. Type(x)NumberType(y)String, 返回比较 x == ToNumber(y) 的结果。

  4. Type(x)StringType(y)Number,返回比较 ToNumber(x) == y 的结果。

  5. Type(x)Boolean, 返回比较 ToNumber(x) == y 的结果。

  6. Type(y)Boolean, 返回比较 x == ToNumber(y) 的结果。

  7. Type(x)StringNumber,且 Type(y)Object,返回比较 x == ToPrimitive(y) 的结果。

  8. Type(x) 为 Object 且 Type(y)StringNumber, 返回比较 ToPrimitive(x) == y 的结果。

  9. 返回 false