判等

参考链接: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

总结

  • 几种方法的不同之处主要在于如何处理0NaN,组合出了多种方法
  • 除了sameValue,都不会区分正负零
  • 要想区分-00,就只能用Object.is()
  • sameValue和sameValueZero都认为NaN等于NaN