Object.is vs ===

JS-*_*WEB 135 javascript ecmascript-6

我偶然发现了一个使用此比较的代码示例:

var someVar = 0;
Object.is(false, someVar); //Returns false 
Run Code Online (Sandbox Code Playgroud)

我知道false == 0会是true这就是为什么我们有===.

有什么Object.is不同===

Gur*_*ngh 163

===在JavaScript中称为严格比较运算符.Object.is并且严格比较运算符的行为完全相同,除了NaN+0/-0.

来自MDN:

Object.is()根据===操作者,方法不相同.的===操作者(和==操作员以及)对待数值-0和0为相等和治疗Number.NaN为不等于NaN.

下面的代码突出的区别===Object.is().

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以在此处找到更多示例.

注意:Object.is是ECMAScript 6提案的一部分,尚未得到广泛支持.但是,您可以将polyfill用于非ES6浏览器,可以在上面给出的链接中找到.

  • 答案的第一行应该是"它们的行为完全相同,除了NaN和+0和-0",可能. (26认同)
  • @ humble.rumble这是详细讨论的 - 静态方法更简单 - 它们没有上下文问题或原始问题.例如,在你的例子中,我期望_false_但JS的新手会期望_true_,因为对字符串执行`.x`将它放入`String`对象(而不是字符串原始值)并且比较将在对象之间和一个字符串 - 这是非常微妙的,是一个陷阱 - 静态避免这些问题,静态方法更简单,更容易使用. (3认同)
  • @humble.rumble 比较DOM节点,已经有这样的方法了,参见[isEqualNode](https://developer.mozilla.org/en-US/docs/Web/API/Node/isEqualNode)。示例:`document.createElement('div').isEqualNode(document.createElement('div')) === true` (2认同)
  • 2017 更新:Object.is() 现在在所有主要浏览器中得到广泛支持。 (2认同)
  • 任何人都可以启发我关于您何时希望将 `-0` 和 `+0` 之间的比较设为 `false` 吗?在我看来,您似乎希望在几乎所有情况下都将它们视为相等。 (2认同)

T.J*_*der 55

Object.is使用规范的SameValue算法,而===使用Strict Equality算法.关于严格等式算法的注释引出了不同之处:

该算法与SameValue算法的不同之处在于它对带符号零和NaN的处理.

注意:

  • NaN === NaN是假的,但是Object.is(NaN, NaN)是真的
  • +0 === -0是真的,但却Object.is(+0, -0)是假的
  • -0 === +0是真的,但却Object.is(-0, +0)是假的

JavaScript 至少有四种"相等":

  • "松散"(==),将强制操作数以使其匹配.规则明确规定,但不明显.("" == 0true; "true" == truefalse,......).
  • "严格"(===),其中不同类型的操作数不会被强制(并且将不相等),但请参阅上面关于NaN正负零的注释.
  • SameValue - 如上所列(由...使用Object.is).
  • SameValueZero -像SameValue除了+0-0是相同的,而不是不同的(所使用的Map钥匙,并通过Array.prototype.includes).

还有对象等价,它不是由语言或运行时本身提供的,但通常表示为:对象具有相同的原型,相同的属性,并且它们的属性值相同(通过一些合理的"相同"定义) ).


SameValue算法:

  • 如果Type(x)与Type(y)不同,则返回false.
  • 如果Type(x)是Number,那么
    • 如果x是NaN且y是NaN,则返回true.
    • 如果x是+0且y是-0,则返回false.
    • 如果x是-0且y是+0,则返回false.
    • 如果x与y的Number值相同,则返回true.
    • 返回false.
  • 返回SameValueNonNumber(x,y).

... SameValueNonNumber是:

  • 断言:类型(x)不是数字.
  • 断言:类型(x)与类型(y)相同.
  • 如果Type(x)是Undefined,则返回true.
  • 如果Type(x)为Null,则返回true.
  • 如果Type(x)是String,那么
    • 如果x和y完全相同的代码单元序列(相应索引处的长度和代码单元相同),则返回true; 否则,返回false.
  • 如果Type(x)是布尔值,那么
    • 如果x和y都为true或两者都为false,则返回true; 否则,返回false.
  • 如果Type(x)是Symbol,那么
    • 如果x和y都是相同的Symbol值,则返回true; 否则,返回false.
  • 如果x和y是相同的Object值,则返回true.否则,返回false.

严格的等式算法:

  1. 如果Type(x)与Type(y)不同,则返回false.
  2. 如果Type(x)是Number,那么
    • 如果x是NaN,则返回false.
    • 如果y是NaN,则返回false.
    • 如果x与y的Number值相同,则返回true.
    • 如果x是+0且y是-0,则返回true.
    • 如果x是-0且y是+0,则返回true.
    • 返回false.
  3. 返回SameValueNonNumber(x,y).