JS 隐式转换

递增/递减(++/--)

  • 应用在含有效数字的字符串时,先转换成数字,再加或减
  • 不含有效数字的字符串,变成NaN
  • 布尔值先转数字再加减
  • 浮点数直接加减
  • 对象上,先调用valueOf()方法,应用上述规则,结果是NaN的话,再调用toString()方法,应用上述规则

加(+)

  • 数字加数字直接加
  • 有一个数是NaN,则结果为NaN
  • Infinity + Infinity = Infinity
  • Infinity + -Infinity = NaN
  • -Infinity + -Infinity = -Infinity
  • 只要有一个数是字符串,将另一个数转成字符串,再拼接
  • 两个都是字符串,直接拼接
  • 只要有一个是对象,数组,布尔值,则调用toString()方法,转成字符串,再应用上述规则,空对象转换字符串为[object Object]数组转换字符串是空字符串;
  • 有一个数是null或undifined,另一个是数字,则转数字再加,null转数字是0,undefined转数字是NaN

减(-)

  • 数字加数字直接减
  • 有一个数是NaN,则结果为NaN
  • Infinity - Infinity = NaN
  • Infinity - -Infinity = Infinity
  • -Infinity - Infinity = -Infinity
  • -Infinity - -Infinity = -NaN
  • 只要有一个是字符串,布尔值,null或undifined,则用Number处理,转成数字,再应用上述规则,null转数字是0,undefined转数字是NaN;
  • 有一个数是对象,包括数组,调用valueOf(),数组和对象调用后得到原值,没有valueOf或valuedOf后的值依然是非原始值,就调用toString()方法,将得到的数转成数字,再按上诉逻辑处理,空数组转数字是0,空对象转数字是NaN

** 注意以空对象作为左操作数的,如果不加括号会把误认为是代码块而不起作用,如下

{} + 1 = 1
({}) + 1 = '[object Object]1'
[] + 1 = '1'

{} - 1 = -1
({}) - 1 = NaN
[] - 1 = -1

关系操作符(<,>,<=,>=)

  • 都是数字,直接比较
  • 都是字符串,对比对应位置的字符编码
  • 只要有一个数字,将另一个数转成数字,再比较
  • 有一个数是对象,则调用valueOf(),没有valueOf或valuedOf后的值依然是非原始值,则调用toString(),根据结果走上述判断
  • 如果一个是布尔值,则先转数字再走上述判断

相等操作符(==)

  • 有一个数是布尔值,则该数转成数字,再比
  • 一个字符串,一个数字,都转成数字,再比
  • 一个对象,一个非对象,调用对象valueOf(),没有valueOf或valuedOf后的值依然是非原始值,则调用toString(),再比
  • null与undifined不会被转换,直接对比,null == undifined(true)
  • 有一个数是NaN,相等操作恒为false,包括NaN == NaN,但不相等操作返回true
  • 两个均为对象,判断引用地址是否一致

你可能感兴趣的:(前端,javascript)