JavaScript 提供了三种不同的比较操作符:
1.严格相等(===)
2.非严格相等(==)
3.Object.is(ECMAScript 6 新特性)
ECMAScript 提供了四种比较操作符:
1.非严格相等(==)
2.严格相等(===):用于Array.portotype.indexOf,Arrayprototype.lastIndexOf,或 case 语句的匹配操作。
3.零值相等:用于TypeArray和ArrayBuffer的构造,Map和Set的操作,并将用于ECMAScript 6 标准的 String.prototype.includes
4.同值相等:用于其它所有场景
简单的说,两个等号判断会进行类型转换,而三等号判断不进行类型转换,Object.is 在三等号基础上特殊处理了,NaN,-0和+0,保证-0和+0不再相等,但是 Object.is(NaN,NaN) 会返回 true.(像其他数值比较一样比较NaN, 不论是双等号还是三等号都会返回 false ),
严格相等 ===
严格相等在进行比较时,不进行隐式的类型转换,只要两个值的类型不同就返回 false ,如果两个比较值的类型相同,值也相同,并且都不是 Number 类型时,两个值全等。如果两个值都是 number 类型,当两个都不是 NAN ,并且数值相同,或两个值分别是-0和+0时,
两个值被认为是全等。
var num = 0;
var obj = new Object("0");
var str = "0";
var b = false;
console.log(num === num); // true
console.log(obj === obj); //true
console.log(str === str); //true
console.log(num === obj); //false
console.log(num === str); //false
console.log(obj === str); //false
console.log(null === undefined); //false
console.log(obj === null); //false
console.log(obj === undefined); //false
在日常使用中全等操作符额几乎是正确的选择,对于除了数值之外的值,全等操作符使用明确的语义进行比较:一个值只与自身相等。对于数值全等
操作符使用略加修改的寓意来处理特殊情况:第一种情况是,浮点数0是部分正负的。区分 -0和+0 在解决一些数学问题时是必要的,但是大部分情况下
我们并不关心。第二种情况是,浮点数包含了 NaN 值,用来表示某些定义不明确的数学问题的解,例如正无穷与负无穷的和。全等操作符认为NaN
与其他任何值都不等,包括他自己,(等式(x !== x)成立的唯一情况是x的值为 NaN)
非严格相等 ==
双等号比较两个值是否相等,在比较时将两个值转换为相同类型后在进行全等操作符比较,
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
print(num == num); // true
print(obj == obj); // true
print(str == str); // true
print(num == obj); // true
print(num == str); // true
print(obj == str); // true
print(null == undefined); // true
// both false, except in rare cases
print(obj == null);
print(obj == undefined);
同值相等
同值相等解决了最后一个用例:确定两个值是否在任何情况下功能上是相同的。
Object.defineProperty(Number, "NEGATIVE_ZERO",
{ value: -0, writable: false, configurable: false, enumerable: false });
function attemptMutation(v)
{
Object.defineProperty(Number, "NEGATIVE_ZERO", { value: v });
}
Object.defineProperty 在试图修改不可变属性时,如果这个属性确实被修改了则会抛出异常,反之什么都不会发生。例如如果 v 是 -0 ,那么没有发生任何变化,所以也不会抛出任何异常。但如果 v 是 +0 ,则会抛出异常。不可变属性和新设定的值使用 same-value 相等比较。
零值相等
与同值相等类似,不过会认为 +0 与 -0 相等。
什么时候使用 Object.is 或是三等
总的来说,除了对待NaN的方式,Object.is唯一让人感兴趣的,是当你需要一些元编程方案时,它对待0的特殊方式,特别是关于属性描述器,即你的工作需要去镜像Object.defineProperty的一些特性时。如果你的工作不需要这些,那你应该避免使用Object.is,使用===来代替。即使你需要比较两个NaN使其结果为true,总的来说编写使用NaN 检查的特例函数(用旧版本ECMAScript的isNaN方法)也会比想出一些计算方法让Object.is不影响不同符号的0的比较更容易些。
更多相关知识请访问:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness