首先,==
equality 等同,===
identity 恒等。==
, 两边值类型不同的时候,要先进行类型转换,再比较。===
,不做类型转换,类型不同的一定不等。
==操作符:
- 如果两个值具有相同类型,会进行
===
比较,返回===
的比较值。(都是Object也走这条路) - 如果两个值不具有相同类型,也有可能返回true
- 如果一个值是null另一个值是undefined,返回true
- 如果一个值是string另个是number,会把string转换成number再进行比较
- 如果一个值是true,会把它转成1再比较,false会转成0
- 如果一个值是Object,另一个是number或者string,会把Object利用 Symbol.toPrimitive(),valueOf()或者toString()转换成原始类型再进行比较,优先级Symbol.toPrimitive() > valueOf() > toString()
===
操作符:
- 如果两个参数的类型不相等,返回false
- 如果两个参数的类型为null或undefined,返回true
- 如果两个参数的类型为数字,那么:
- 如果有一个操作符的值为NaN,那么返回false
- 如果不为NaN,且两数值相等,那么返回true
- 在比较数值时不区分+0和-0,即
-0===+0
,+0===-0
- 如果两个参数的类型为字符串,那么比较两个字符串的值是否相等
- 如果两个参数的类型为对象,那么判断这两个参数是否为同一个对象(指向同一引用)
- 如果两个参数的类型为符号(Symbol),那么判断这两个参数是否为同一个符号。