这里是原文
这里是翻译
a == b 符号的比较判断规则
- a和b是同类型
- a 是undefined or null, 返回true
- a 是number
- 只要a or b 是NaN, 返回false(包括a和b都是NaN的情况,a=NaN,b=NaN, a == b //false)
- a && b 都不是NaN, 则判断数值,相等true,不等false
- a 是string,则判断字符串长度以及每一个charAt(i)是否相等,相等为true,不等为false
- a 是boolean, 都是true或者false,返回true,否则返回false
- a 和b是同Object值,则如果引用地址不同,返回false,否则true
- a和b是null和undefined,则返回true
- a和b里一个是number,一个是string, 则将string转number,再从1开始判断
- a和b里一个是boolean,则将boolean转number,再从1开始判断
- a和b里一个是Object,一个是string/number,则将Object转原始值,再从1开始判断
- a和b都是Object,但是是不同原型的实例,则返回false
注:将Object转原始值的逻辑是
- a or b 是Object
- 有[Symbol.toPrimitive](hint)方法
- 返回原始值,则执行1
- 否则throw error
- 调用valueOf,如果valueOf返回原始值,则执行1,否则往下判断
- 调用toString(), 如果toString返回原始值,则执行1, 否则throw error
- 有[Symbol.toPrimitive](hint)方法