JS + operator 的隐式转换

276 阅读2分钟

本文主要总结了js里+号操作符是如何隐式转换操作数的

js共有5种原始值:string,number,boolean,null,undefined

二元操作符 a + b

  1. a && b 是原始值
    1. a or b 是string, 则另一方转string,之后concate
    2. a or b 是number, 则另一方转number,之后add(a/b是NaN,则结果为NaN)
    3. a && b 既不是string,也不是number, 则都转number,之后执行1-2
  2. a or b 是Object
    1. 有[Symbol.toPrimitive](hint)方法
      • 返回原始值,则执行1
      • 否则throw error
    2. 调用valueOf,如果valueOf返回原始值,则执行1,否则往下判断
    3. 调用toString(), 如果toString返回原始值,则执行1, 否则throw error
    • 说明
      • 原生Object非function对象的valueOf方法返回了对象自身,并没有返回原始值,toString返回原始值 "[object object]"
      • function对象的valueOf方法返回了对象自身,并没有返回原始值,toString返回原始值 "function(){}"
    • 内置对象特例
      • Array:由于Array实现了toString但是仅继承了Object的valueOf,所以根据以上规则,Array会先调用valueOf()返回Array非原始值,再调用toString()返回字符串原始值
      • Date:如果Object是Date对象的话,则直接执行toString(),即使Date自己实现了valueOf方法返回原始值

一元操作符 +a

  1. a 是原始值
    1. 一律转number
  2. a 是Object
    1. 有[Symbol.toPrimitive](hint)方法
      • 返回原始值,则执行1
      • 否则throw error
    2. 调用valueOf,如果valueOf返回原始值,则执行1,否则往下判断
    3. 调用toString(), 如果toString返回原始值,则执行1, 否则throw error

上面描述了+作为二元和一元操作符的转换规则,但是并没有再进一步讲述原始值转number和string的规则,下面将说明下转换规则

非number原始值转number

  1. string 转number
    1. "" 空串转number,值为0
    2. "12" 数字字符串转number,值为数字
    3. "12a" 包含非数字字符串转number,值为NaN
  2. boolean 转number
    1. true 转number,值为1
    2. false 转number,值为0
  3. null 转number,值为0
  4. undefined 转number,值为NaN

非string原始值转string

  1. number 转string
    1. 数字 转string 值为"数字"
    2. NaN 转string 值为"NaN"
  2. boolean 转string
    1. true 转string 值为"true"
    2. false 转string 值为"fasle"
  3. null 转string,值为"null"
  4. undefined 转string,值为"undefined"