Object.is vs ===

时间:2015-05-30 06:44:18

标签: javascript ecmascript-6

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

var someVar = 0;
Object.is(false, someVar); //Returns false 

我知道false == 0将是true,这就是我们===的原因。

Object.is===的区别如何?

5 个答案:

答案 0 :(得分:154)

===在JavaScript中称为严格比较运算符。除Object.isNaN外,+0/-0和严格比较运算符的行为完全相同。

来自MDN:

  根据{{​​1}}运算符,

Object.is()方法不相同。 ===运算符(以及===运算符)将数字值-0和+0视为相等,并将==视为不等于Number.NaN

下面的代码突出显示了NaN===之间的差异。

Object.is()

enter image description here

您可以找到更多示例here

注意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 是ECMAScript 6提案的一部分,尚未得到广泛支持。但是,您可以将polyfill用于非ES6浏览器,可以在上面给出的链接中找到。

答案 1 :(得分:55)

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

  

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

请注意:

  • NaN === NaN为false,但Object.is(NaN, NaN)为真
  • +0 === -0为真,但Object.is(+0, -0)为假
  • -0 === +0为真,但Object.is(-0, +0)为假

JavaScript 至少四种“平等”:

  • “Loose”(==),其中将强制操作数以使其匹配。规则是clearly specified,但不明显。 ("" == 0true; "true" == truefalse,...)。
  • “严格”(===),其中不同类型的操作数不会被强制(并且不相等),但请参阅上面关于NaN和正负零的注释。
  • SameValue - 如上所列(由Object.is使用)。
  • SameValueZero - 与SameValue类似,+0-0相同而不是相同(由Map用于键和Array.prototype.includes)。< / LI>

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

SameValue algorithm

  
      
  • 如果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的数字值相同,则返回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。
  •   

Strict Equality Algorithm

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

答案 2 :(得分:1)

Object.is = function(v1, v2){
  //test for `-0`
  if(v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
  }
  
  //test for `NaN`
  if(v1 !== v1) {
    return v2 !== v2;
  }
  
  //everything else
  return v1 === v2;
}

上面是polyfill函数,用于显示Object.is如何工作,对于任何有兴趣知道的人。对You-Don't-Know-JS

的引用

答案 3 :(得分:1)

摘要:

Object.is()函数使用2个值作为参数,如果给定的2个值完全相同,则返回true,否则将返回false。

我们为什么需要这个?

您可能会认为,我们已经使用===运算符在javascript中进行了严格的相等(检查类型+值)检查,为什么我们需要此功能?严格的平等在某些情况下是不够的,它们是:

console.log(NaN === NaN);   // false
console.log(-0 === +0);     // true

Object.is()通过比较这些值以查看它们是否相似来提供帮助,这是严格相等运算符无法做到的。

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

答案 4 :(得分:0)

简而言之,它们是相似的,但是Object.is更聪明,更准确...

让我们看看这个...

+0 === -0 //true

但这并不完全正确,因为它在...之前忽略了-+ ...

现在我们使用:

Object.is(+0, -0) //false

如您所见,比较起来更准确。

如果NaN的工作原理更像是正确的,则认为任何NaN都一样。