值转换过程

92 阅读1分钟

一、转换为布尔值

False值

  • false:布尔值false
  • 0-0:正负零
  • 0n:BigInt零
  • "":空字符串
  • null:空值
  • undefined:未定义
  • NaN:非数字

虽然[].toString() === """"是falsy,但Boolean([])===true,因为对象直接转布尔值不经过toString

二、转为字符串

  • undefined → "undefined"
  • null → "null"
  • true → "true", false → "false"
  • 42 → "42"
  • 对象:{}.toString() → [object Object]")
  • 数组:[1,2].toString() → "1,2"(不返回"[object Array]")因为在Array重写toString方法不使用Object.prototype.toString方法

三、转为数字(ToNumber)

基本类型

  • undefined → NaN
  • null → 0
  • true → 1, false → 0
  • 字符串:解析数值或NaN,空串为0

对象转数字

  • 先尝试valueOf()
  • 如返回的仍是对象,再调用toString()
  • 再将得到的原始值转为数字
  1. 常见结果:

    • Number([]) → 0([] → "" → 0)
    • Number([1]) → 1([1] → "1" → 1)
    • Number([1,2]) → NaN([1,2] → "1,2" → NaN)
    • Number({}) → NaN({} → "[object Object]" → NaN)

四、运算符中的类型转换

算术运算符

  1. 一元+ :强制转为数字(+"42" → 42)

  2. 二元+ :特殊行为

    • 有字符串则进行字符串连接
    • 否则转为数字后相加
  3. 其他算术运算符(-,*,/,%):操作数都转为数字

比较运算符

  1. 严格相等===:不进行类型转换

  2. 松散相等==

    • null == undefined 为 true(特例)
    • NaN于其余任何类型判断都为false
    • 对象与原始值比较:对象先转为原始值
    • 不同类型原始值:尝试转为相同类型(通常是数字)
  3. 大小比较:

    • 字符串比较:按字典顺序
    • 其他情况:转为数字后比较