JS + operator 的隐式转换

本文主要总结了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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值