“===”叫做严格相等,”==”叫做抽象相等。 |
‘===’的运算规则如下
- 不同类型值。
如果两个值的类型不同,直接返回false。 - 同一类的原始类型值。
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同返回true,否则返回false。 - 同一类的复合类型值。
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。 - undefined和null。
只与本身自己比较才返回true。
’==’在比较相同类型的数据时,与‘===’完全一样。不过在比较不同类型的数据时,会先将数据进行类型转换,转换成相同类型进行比较。
‘==’不同类型转换规则:
1. 原始类型的值。
原始类型的数据会转换成数值类型再进行比较。字符串和布尔值都会转换成数值。
2. 对象与原始类型值比较。
对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
3. undefined和null。
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
<script>
console.log(''=='0');
console.log(0 == '');
console.log(0 == '0');
console.log(false == 'false');
console.log( false == '0');
console.log(false == undefined);
console.log(false == null );
console.log(null == undefined);
/*
false
true
true
false
true
false
false
true
*/
</script>
来一个详细步骤的: [] == ![] [] == !true // ! 操作符的优先级高于 == ,所以先执行 ! 操作 [] == false // !true 得到的是 false [] == 0 //如果值为true或false,则转成1或0来继续比较 [] == 0 //执行左侧的 [] 的 valueOf 方法,而 [] 是对象,所以 [].valueOf() 返回本身 [] “” == 0 //执行左侧的 [] 的 toString 方法,[].toString() 返回 “” 0 == 0 //如果一个值是数字,一个值是字符串,则把字符串转换为数字,再进行比较,”” 转成数字是 0。 最终是执行 0 == 0 ,结果为 true。 |
总 结:
严格等首先要求类型一样,在比较过程中不执行类型转换,抽象等对比较对象的类型会执行转换,再转换为同一类型后再进行值得比较。所以,在进行比较的时候不建议使用‘==’。