この比較を使用しているコード例に出くわしました。
var someVar = 0;
Object.is(false, someVar); //Returns false
私は知っているfalse == 0
だろうtrue
、我々が持っている理由です===
。
どうObject.is
違うの===
?
この比較を使用しているコード例に出くわしました。
var someVar = 0;
Object.is(false, someVar); //Returns false
私は知っているfalse == 0
だろうtrue
、我々が持っている理由です===
。
どうObject.is
違うの===
?
回答:
===
JavaScriptでは厳密比較演算子と呼ばれます。Object.is
厳密な比較演算子はNaN
、およびを除いてまったく同じように動作します+0/-0
。
MDNから:
Object.is()
===
演算子によると、方法は同じではありません。===
オペレータ(及び==
同様にオペレータ)は数値を扱う-0と等しいと扱いとして0Number.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.is
ECMAScript 6の提案の一部であり、まだ広くサポートされていません(たとえば、Internet Explorerのどのバージョンや他の多くの古いバージョンのブラウザーでもサポートされていません)。ただし、上記のリンクにある非ES6ブラウザーのポリフィルを使用できます。
.x
に文字列ボックスの上にString
オブジェクト(およびない文字列プリミティブ値)との比較は、オブジェクトと文字列の間だろう-これは非常にあります微妙で落とし穴です-静的メソッドはこれらの問題を回避し、静的メソッドはよりシンプルで使いやすくなっています。
document.createElement('div').isEqualNode(document.createElement('div')) === true
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種類の「同等」があります。
==
)。オペランドを一致させようと強制されます。ルールは明確に指定されていますが、明白ではありません。("" == 0
is true
; "true" == true
is false
、...)。===
)、異なるタイプのオペランドは強制されません(そして等しくありません)がNaN
、正と負のゼロに関する上記の注を参照してください。Object.is
)。SameValue
を除いて似て+0
おり-0
、異なるのではなく同じです(Map
forキーとによって使用されますArray.prototype.includes
)。言語やランタイム自体では提供されないオブジェクトの等価性もありますが、通常は次のように表現されます。 )。
- 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を返します。
- Type(x)がType(y)と異なる場合は、falseを返します。
- Type(x)が数値の場合、
- xがNaNの場合、falseを返します。
- yがNaNの場合、falseを返します。
- xがyと同じ数値の場合、trueを返します。
- xが+0でyが-0の場合、trueを返します。
- xが-0でyが+0の場合、trueを返します。
- falseを返します。
- SameValueNonNumber(x、y)を返します。
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への参照
この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