web-gelistirme-sc.com

İki özdeş nesne neden birbirine eşit değil?

Görünüşe göre aşağıdaki kod bir true döndürmelidir, ancak false döndürür. 

var a = {};
var b = {};

console.log(a==b); //returns false
console.log(a===b); //returns false

Bu nasıl mantıklı?

36
Maxx

Normal (==) ve katı (===) eşitlik arasındaki tek fark katı eşitlik operatörünün tür dönüştürmesini devre dışı bırakmasıdır. Aynı tipteki iki değişkeni zaten karşılaştırdığınız için, kullandığınız eşitlik operatörünün önemi yoktur.

Normal veya katı eşitlik kullanmanıza bakılmaksızın, nesne karşılaştırmaları yalnızca trueaynı nesneyi karşılaştırırsanız olarak değerlendirilir.

Yani, var a = {}, b = a, c = {};, a == a, a == b, ancak a != c olarak verilir.

İki farklı nesne (ikisi de sıfır veya aynı özelliklere sahip olsalar bile) hiçbir zaman eşit olarak karşılaştırılmaz. İki nesnenin özelliklerinin eşitliğini karşılaştırmanız gerekirse, bu sorunun çok faydalı cevapları var .

39
josh3736

Bu nasıl mantıklı?

Çünkü, nesne referanslarının "eşitliği", == ve === operatörleri açısından, referansların same nesnesine atıfta bulunup bulunmadığına dayanarak tamamen 'dir. Bu açıkça soyut eşitlik karşılaştırma algoritması (== tarafından kullanılır) ve katı eşitlik karşılaştırma algoritması (=== tarafından kullanılır) 'da açıkça belirtilmiştir.

Kodunuzda, a==b veya a===b deyince, nesneler'i karşılaştırmazsınız, aynı nesneye başvurup uymadıklarını görmek için a ve b içindeki referansları karşılaştırırsınız. Bu sadece JavaScript'in nasıl tanımlandığı ve eşitlik operatörlerinin diğer pek çok dilde (ancak tümü değil) nasıl işlediğine bağlı olarak (Java, C # [işleci geçersiz kılmadıkça olarak string ] ve C++ Örneğin).

JavaScript'in yerleşik eşdeğerlik kavramı yoktur, nesnelerin eşdeğer olup olmadıklarını gösteren bir karşılaştırma yapar (örneğin, Java'nın Object#equals gibi, aynı değerlerle aynı özelliklere sahip). Birini kendi kod tabanınız içinde tanımlayabilirsiniz, ancak onu tanımlayan özünde hiçbir şey yoktur.

13
T.J. Crowder

===, nesneler için kesinlikle eşit işleci, kimliği denetler.

Aynı Nesne'ye başvurdukları takdirde iki nesne kesinlikle eşittir.

Bunlar iki farklı nesne, bu yüzden farklı.

İki boş sayfa kağıdı düşünün. Nitelikleri aynıdır, fakat aynı şey değildir. Birine bir şey yazarsan, diğeri değişmez.

2
Karoly Horvath

Kesin Rehberden Javascript'e.

Nesneler değerle karşılaştırılmaz: iki özellik aynı özelliklere ve değerlere sahip olsalar bile eşit değildir. Bu, diziler için de geçerlidir: aynı sırada aynı değerlere sahip olsalar bile.

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 

Nesnelere bazen bunları JavaScript’in ilkel türlerinden ayırmak için referans türleri denir. Bu terminolojiyi kullanarak, nesne değerleri referanstır ve nesnelerin referans ile karşılaştırıldığını söyleriz: iki nesne değeri, eğer aynı temel nesneye atıfta bulunurlarsa aynıdır. 

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. 

İki farklı nesneyi karşılaştırmak istiyorsak, özelliklerini karşılaştırmalıyız. 

2
Charlie Lynch
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
1
Christina

Bu nasıl mantıklı?

Bu iki nesneyi hayal edin:

var a = { someVar: 5 }
var b = { another: 'hi' }

Şimdi eğer a === b yaptıysanız, sezgisel olarak yanlış olduğunu düşünürdünüz (bu doğru). Ancak, nesnelerin farklı anahtarlar içerdiği için yanlış mı olduğunu düşünüyorsunuz veya farklı nesneler ? Daha sonra anahtarları her bir nesneden çıkardığınızı hayal edin:

delete a.someVar
delete b.another

Her ikisi de artık boş nesnelerdir, ancak eşitlik kontrolü hala tamamen aynı olacaktır, çünkü hala a ve b'ın aynı nesne olup olmadığını (aynı anahtarları ve değerleri içerip içermediklerini) karşılaştırıyorsunuz.

0
Matt Way