ES2015中有四种等式算法:
抽象相等比较 (==)严格相等比较 (===): 用于 Array.prototype.indexOf,
Array.prototype.lastIndexOf, 和 case-***tching同值零: 用于 %TypedArray% 和 ArrayBuffer 构造函数、以及Map和Set操作, 并将用于 ES2016/ES7 中的String.prototype.includes同值: 用于所有其他地方
JavaScript提供了三种不同的值比较操作:
严格相等 (“triple equals” 或 “identity”),使用 === ,宽松相等 (“double equals”) ,使用 ==以及 Object.is (ECMAScript 2015/ ES6 新特性)
使用哪种操作取决于您需要哪种比较。
简而言之,比较两个事物时,双等号会进行类型转换;三个等号会在没有类型转换的情况下做同样的比较(如果类型不一样,总是返回false);而Object.is的行为方式和三个等号一样,只是对NaN和-0和+0进行了特殊处理,所以后两者是不同的,Object.is(NaN,NaN)将为真。(通常用双等号或三等号比较NaN,结果是假的,因为IEEE 754是这么说的。)请注意,所有这些之间的差异与其处理原语有关;这三个运算符的原语都不会比较两个变量在结构和概念上是否相似。对于任意两个不同的非原始对象,即使它们的结构相同,上述三个运算符也会计算出false。
严格相等= = =
Equal运算符比较两个值是否相等,并且两个被比较的值在比较之前不会进行隐式转换。如果两个比较值的类型不同,则这两个值不全等。否则,如果两个比较的值类型相同,值相同,并且都不是数字类型,则两个值全等。最后,如果两个值都是number类型,则当它们不是NaN并且分别具有相同的值或+0和-0时,这两个值被认为是全等的。
在日常生活中使用同余运算符几乎总是正确的选择。对于数值以外的值,同余运算符使用显式语义进行比较:一个值只与其自身全等。对于数值,同余运算符使用稍微修改的语义来处理两种特殊情况:第一种情况是浮点数0既是正数也是负数。在解决一些具体的数学问题时,区分+0和-0是很有必要的,但大多数情况下我们不必在意。同余运算符认为这两个值是全等的。第二种情况,浮点数包含NaN值,用来表示一些定义不清的数学问题的解,比如正无穷大加负无穷大。全等运算符认为NaN与任何其他值都不全等,包括它本身。(方程式(x!== x)仅当x的值为NaN时为真)。
非严格等式
相等运算符比较两个值是否相等,并在比较之前将两个比较值转换为相同的类型。转换后(方程的一面或两面都可以转换),最终的比较方法与全等运算符= = =的比较方法是等价的。等式算子满***换律。
相等运算符比较不同类型的值,如下图所示:
上表中,ToNumber(A)试图在比较之前将参数A转换为数字,其效果与+A(一元运算符+)相同。尝试依次调用a的A.toString和A.valueOf方法,将参数a转换为原始值。
一般来说,根据ECMAScript规范,所有对象不等于未定义和空。但是,大多数浏览器只允许很窄的对象类别(即所有页面中的document.all对象),在某些情况下,这是未定义的一个例子。等号运算符就是在这样的背景下产生的。因此,is false(A)方法的值为true当且仅当A模仿undefined。在所有其他情况下,对象将不等于未定义或空。
一些开发人员认为最好不要使用等号运算符。同余运算符的结果更容易预测,而且由于没有隐式转换,同余比较运算会更快。
同等价值
等值解决了最后一个用例:确定两个值在任何情况下是否功能相同。(这个用例展示了Richter替代原则的一个例子。)当你试图修改一个不可变的属性时会发生什么:
当Object.defineProperty试图修改一个不可变的属性时,如果该属性确实被修改了,它将抛出一个异常,否则什么都不会发生。例如,如果v为-0,则没有任何变化,因此不会引发异常。但是如果v是+0,就会抛出异常。使用相同值等式将不可变属性与新设置的值进行比较。相等的值由Object.is方法提供。
同等价值
类似于equal value,但是+0被认为等于-0。
理解平等比较的模式
在ES2015之前,你可能会说双三等是& 展开&;的关系。比如有人会说double类是第三类的扩展版,因为它处理的是第三类做的事情,进行类型转换。比如6 = = “6”。相反,别人可能会说第三个类是第二个类的扩展,因为他也要求两个参数是同类型的,增加了更多的限制。怎么理解取决于你怎么看问题。
但是这种比较是无法把ES2015的Object.is排进去的。因为Object.is不比双类宽松,也不比三类严格,当然也不在其中。从下表可以看出,这是由于Object.is处理NaN的不同,注意,如果Object.is(NaN,NaN)计算为false,我们可以说它比三类更严格,因为它可以区分-0和+0。但是对南的治疗表明这是错误的。Object.is应该被认为是有其特殊目的的,不应该说它比别人更宽松或更严格。
本文来自微笑向暖投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/503748.html