JavaScript 中的相等性判断

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值