JS == 操作符的隐式转换,翻译ecma-262/5.1/#sec-11.6.1

268 阅读1分钟

翻译自www.ecma-international.org/ecma-262/5.…

这里是原文

这里是翻译

a == b 符号的比较判断规则

  1. a和b是同类型
    1. a 是undefined or null, 返回true
    2. a 是number
      1. 只要a or b 是NaN, 返回false(包括a和b都是NaN的情况,a=NaN,b=NaN, a == b //false)
      2. a && b 都不是NaN, 则判断数值,相等true,不等false
    3. a 是string,则判断字符串长度以及每一个charAt(i)是否相等,相等为true,不等为false
    4. a 是boolean, 都是true或者false,返回true,否则返回false
    5. a 和b是同Object值,则如果引用地址不同,返回false,否则true
  2. a和b是null和undefined,则返回true
  3. a和b里一个是number,一个是string, 则将string转number,再从1开始判断
  4. a和b里一个是boolean,则将boolean转number,再从1开始判断
  5. a和b里一个是Object,一个是string/number,则将Object转原始值,再从1开始判断
  6. a和b都是Object,但是是不同原型的实例,则返回false

注:将Object转原始值的逻辑是

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