判等
参考链接:https://www.cnblogs.com/mengfangui/p/9343163.html
1. Abstract Equality Comparision ==
- == 比较前进行强制转换
2. Strict Equality Comparison ===
- === 不进行强制类型转换
NaN
不等于自身+0
等于-0
- indexOf内部使用的就是
===
3. Same Value Object.is(val1, val2)
- 区分正负零(1/0 === Infinity; 1/-0 === -Infinity)
- NaN等于NaN(x !== x)
// pollyfill Object.is()
if(!Object.is){
Object.is = function(x,y){
if(x===y){
// 判断 +0 和 -0
return x !== 0 || 1/x === 1/y;
}else{
// 判断NaN
return x!==x && y!==y;
}
}
}
4. Same Value Zero
- 暂时没有API,但是多处使用
- set,map
- 数组的includes
var s = new Set();
s.add(0);
s.add(NaN);
s.has(-0); // true
s.has(NaN); // true
var a = [0, NaN];
a.indexOf(-0); // 0
a.indexOf(NaN); // -1
a.includes(-0); // true
a.includes(NaN); // true
总结
- 几种方法的不同之处主要在于如何处理
0
和NaN
,组合出了多种方法 - 除了sameValue,都不会区分正负零
- 要想区分
-0
和0
,就只能用Object.is()
- sameValue和sameValueZero都认为
NaN
等于NaN