Object.is vs ===


141

この比較を使用しているコード例に出くわしました。

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

私は知っているfalse == 0だろうtrue、我々が持っている理由です===

どうObject.is違うの===

回答:


174

===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

ここに画像の説明を入力してください

あなたはここでより多くの例を見つけることができます。

Object.isECMAScript 6の提案の一部であり、まだ広くサポートされていません(たとえば、Internet Explorerのどのバージョンや他の多くの古いバージョンのブラウザーでもサポートされていません)。ただし、上記のリンクにある非ES6ブラウザーのポリフィルを使用できます。


26
答えの最初の行は、「おそらく、NaNと+0と-0を除いてまったく同じように動作します。
Benjamin Gruenbaum 2015年

1
@BenjaminGruenbaum良い提案。答えを読みやすくします。乾杯。
Gurpreet Singh 2015

3
@ humble.rumbleこれについて詳しく説明しました-静的メソッドの方が簡単です-コンテキストの問題や原始的な問題はありません。例えば、あなたの例では私が期待しかしJSへの初心者には期待する真のやっているので.xに文字列ボックスの上にStringオブジェクト(およびない文字列プリミティブ値)との比較は、オブジェクトと文字列の間だろう-これは非常にあります微妙で落とし穴です-静的メソッドはこれらの問題を回避し、静的メソッドはよりシンプルで使いやすくなっています。
Benjamin Gruenbaum

2
@ humble.rumble DOMノードを比較するために、すでにそのようなメソッドがあります。isEqualNodeを参照してください。例:document.createElement('div').isEqualNode(document.createElement('div')) === true
Rob W

2
2017年の更新:Object.is()がすべての主要ブラウザーで広くサポートされるようになりました。
スターリングボーン

56

Object.is仕様のSameValueアルゴリズム===使用するのに対し、厳密な平等アルゴリズムを使用します。厳密な平等アルゴリズムに関する注意は、違いを示しています。

このアルゴリズムは、SameValueアルゴリズムとは異なります...符号付きゼロとNaNの扱い方が異なります。

ご了承ください:

  • NaN === NaNは偽ですがObject.is(NaN, NaN)、真です
  • +0 === -0真ですが、Object.is(+0, -0)偽です
  • -0 === +0真ですが、Object.is(-0, +0)偽です

JavaScriptには少なくとも 4種類の「同等」があります。

  • "緩い"(==)。オペランドを一致させようと強制されます。ルールは明確に指定されていますが、明白ではありません。("" == 0is true; "true" == trueis false、...)。
  • "Strict"(===)、異なるタイプのオペランドは強制されません(そして等しくありません)がNaN、正と負のゼロに関する上記の注を参照してください。
  • SameValue-上記のように(によって使用されますObject.is)。
  • SameValueZero- SameValueを除いて似て+0おり-0、異なるのではなく同じです(Mapforキーとによって使用されますArray.prototype.includes)。

言語やランタイム自体では提供されないオブジェクトの等価性もありますが、通常は次のように表現されます。 )。


SameValueアルゴリズム

  • Type(x)がType(y)と異なる場合は、falseを返します。
  • Type(x)が数値の場合、
    • xがNaNでyがNaNの場合、trueを返します。
    • xが+0でyが-0の場合、falseを返します。
    • xが-0でyが+0の場合、falseを返します。
    • xがyと同じ数値の場合、trueを返します。
    • falseを返します。
  • SameValueNonNumber(x、y)を返します。

... SameValueNonNumberは次のとおりです。

  • アサート:Type(x)は数値ではありません。
  • アサート:Type(x)はType(y)と同じです。
  • Type(x)が未定義の場合、trueを返します。
  • Type(x)がNullの場合、trueを返します。
  • Type(x)が文字列の場合、
    • 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)が数値の場合、
    • xがNaNの場合、falseを返します。
    • yがNaNの場合、falseを返します。
    • xがyと同じ数値の場合、trueを返します。
    • xが+0でyが-0の場合、trueを返します。
    • xが-0でyが+0の場合、trueを返します。
    • falseを返します。
  3. SameValueNonNumber(x、y)を返します。

2

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;
}

上記は、Object.is知りたい人のために、どのように機能するかを示すためのpolyfill関数です。You-Don't-Know-JSへの参照


2

概要:

この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


0

一言で言えば、それらは似ていますObject.isが、よりスマートで正確です...

これを見てみましょう...

+0 === -0 //true

しかし、これは無視し-+以前は完全に正しくありません...

今私たちは使用します:

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

ご覧のとおり、これは比較する方が正確です。

また、同じことNaNを考えると、それが正しいように機能する場合もNaN同様です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.