次のコードはtrueを返すはずですが、falseを返します。
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
これはどのように意味がありますか?
次のコードはtrueを返すはずですが、falseを返します。
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
これはどのように意味がありますか?
==
通常の( )と厳密な( )の等式の唯一の違い===
は、厳密な等式演算子が型変換を無効にすることです。同じタイプの2つの変数をすでに比較しているので、使用する等式演算子の種類は重要ではありません。
通常の等式を使用するか厳密な等式を使用するかに関係なく、オブジェクトの比較はtrue
、まったく同じオブジェクトを比較する場合にのみ評価されます。
つまり、、、、が与えられますがvar a = {}, b = a, c = {};
、。a == a
a == b
a != c
2つの異なるオブジェクト(両方がゼロまたは同じ正確なプロパティを持っている場合でも)が等しく比較されることはありません。2つのオブジェクトのプロパティの同等性を比較する必要がある場合、この質問には非常に役立つ回答があります。
これはどのように意味がありますか?
==
および===
演算子に関するオブジェクト参照の「同等性」は、参照が同じオブジェクトを参照しているかどうかに純粋に基づいているためです。これは、抽象的等式比較アルゴリズム(によって使用される)と厳密な等式比較アルゴリズム(によって使用される)に明確に示されています。==
===
あなたのコードでは、a==b
またはと言うとき、あなたはオブジェクトa===b
を比較していません、あなたはの参照を比較していて、それらが同じオブジェクトを参照しているかどうかを確認しています。これはJavaScriptの定義方法であり、他の多くの(すべてではない)言語の等式演算子の定義方法と一致しています(Java、C#[演算子がオーバーライドされない限り]、C ++など)。a
b
string
JavaScriptには、同等性の概念が組み込まれていません。これは、オブジェクトが同等であるかどうかを示すオブジェクト間の比較です(たとえば、Javaのように、同じ値を持つ同じプロパティを持っていますObject#equals
)。独自のコードベース内で定義できますが、それを定義する本質的なものはありません。
Javascriptの決定的なガイドから。
オブジェクトは値で比較されません。2つのオブジェクトは、同じプロパティと値を持っていても等しくありません。これは配列にも当てはまります。同じ順序で同じ値を持っている場合でもです。
var o = {x:1}, p = {x:1}; // Two objects with the same properties
o === p // => false: distinct objects are never equal
var a = [], b = []; // Two distinct, empty arrays
a === b // => false: distinct arrays are never equal
オブジェクトは、JavaScriptのプリミティブ型と区別するために、参照型と呼ばれることもあります。この用語を使用すると、オブジェクト値は参照であり、オブジェクトは参照によって比較されると言います。2つのオブジェクト値は、同じ基になるオブジェクトを参照している場合にのみ同じです。
var a = {}; // The variable a refers to an empty object.
var b = a; // Now b refers to the same object.
b.property = 1; // Mutate the object referred to by variable b.
a.property // => 1: the change is also visible through variable a.
a === b // => true: a and b refer to the same object, so they are equal.
2つの異なるオブジェクトを比較する場合は、それらのプロパティを比較する必要があります。
use JSON.stringify(objname);
var a = {name : "name1"};
var b = {name : "name1"};
var c = JSON.stringify(a);
var d = JSON.stringify(b);
c==d;
//true
{} === {}
戻る理由の簡単な説明は次のとおりです。false
MDNWebDocsから- Working with objects: Comparing objects
。
JavaScriptでは、オブジェクトは参照型です。同じプロパティを持っていても、2つの異なるオブジェクトが等しくなることはありません。同じオブジェクト参照をそれ自体と比較するだけでtrueが得られます。
// Two variables, two distinct objects with the same properties
var fruit = {name: 'apple'};
var fruitbear = {name: 'apple'};
fruit == fruitbear; // return false
fruit === fruitbear; // return false
// Two variables, a single object
var fruit = {name: 'apple'};
var fruitbear = fruit; // Assign fruit object reference to fruitbear
// Here fruit and fruitbear are pointing to same object
fruit == fruitbear; // return true
fruit === fruitbear; // return true
fruit.name = 'grape';
console.log(fruitbear); // output: { name: "grape" }, instead of { name: "apple" }
比較演算子の詳細については、比較演算子を参照してください。
===
、オブジェクトの厳密に等しい演算子はIDをチェックします。
2つのオブジェクトが同じオブジェクトを参照している場合、それらは厳密に等しくなります。
これらは2つの異なるオブジェクトであるため、異なります。
空の2ページの紙について考えてみてください。それらの属性は同じですが、同じものではありません。それらの1つに何かを書いても、もう1つは変わりません。
これはどのように意味がありますか?
これらの2つのオブジェクトを想像してみてください。
var a = { someVar: 5 }
var b = { another: 'hi' }
さて、もしあなたがそうしたらa === b
、あなたはそれが間違っているべきだと直感的に思うでしょう(これは正しいです)。しかし、オブジェクトに異なるキーが含まれているため、またはそれらが異なるオブジェクトであるため、それは誤りだと思いますか?次に、各オブジェクトからキーを削除することを想像してください。
delete a.someVar
delete b.another
両方とも空のオブジェクトになりましたが、同じオブジェクトであるかどうか(同じキーと値が含まれているかどうかではない)a
を比較しているため、同等性チェックはまったく同じです。b
これは回避策です:Object.toJSON(obj1) == Object.toJSON(obj2)
文字列に変換することにより、比較は基本的に文字列になります
In Javascript each object is unique hence `{} == {}` or `{} === {}` returns false. In other words Javascript compares objects by identity, not by value.
1. Double equal to `( == )` Ex: `'1' == 1` returns true because type is excluded
2. Triple equal to `( === )` Ex: `'1' === 1` returns false compares strictly, checks for type even