Object.is() 与比较操作符 “=== ”、“==” 的区别
1、 ==
- 执行类型转换,然后进行比较,适用于比较值时允许类型转换的场景。
- null 和 undefined 相等。
- String 和 Number 相等时会尝试转换为数值进行比较。
- 如果有布尔值,会先将布尔值转换为数值(true转为1,false转为0)再进行比较。
- 对象与非对象比较时,对象会通过调用其toString()或valueOf()方法转换为原始值进行比较。
2、 ===
- 不执行类型转换,如果类型不同立即返回false,类型相同再比较值。
- 较为严格,更能精确地判断两个值是否真正相等。
- 一个特殊情况是NaN === NaN 会返回false,因为在IEEE 754标准中,NaN被视为与任何值都不相等,包括它自己。
- +0 === -0会返回true,尽管在数学上+0和-0有细微的差别。
3、Object.is()
- ES6引入的方法,行为方式类似于严格等于,但对待NaN和+0/-0有不同处理。
- Object.is(NaN, NaN) 会返回true,解决了使用===时NaN的比较问题。
- Object.is(+0, -0) 会返回false,更精确地对待了+0和-0。
- 在大多数情况下与 === 行为一致,特殊处理了上面两种边缘情况。
4、对比示例
console.log('1' == 1);
console.log(null == undefined);
console.log(true == 1)
console.log('1' === 1);
console.log(NaN === NaN);
console.log(+0 === -0);
console.log(Object.is('1', 1));
console.log(Object.is(NaN, NaN));
console.log(Object.is(+0, -0));
5、总结
- 使用==适合需要自动类型转换的比较。
- 使用===是最常见的比较方式,因为它不进行类型转换,减少了意外的情况,适用于大多数场景。
- Object.is()方法在做一些更精确的比较时非常有用,尤其是处理NaN和+0/-0等特殊情况时。