2011-10-10 28 views
5

Firebug yapılır aşağıdakiler: Javascript'te, neden [1, 2] == [1, 2] veya ({a: 1}) == ({a: 1}) yanlıştır?

>>> [1, 2] == [1, 2] 
false 

>>> ({a : 1}) == ({a : 1}) 
false 

Ben Javscript düşünce bir nesne ya da dizi aynı elemanlar için aynı referansları varsa, o zaman eşittir diyor bazı kuralı vardır?

Ama

>>> foo = {a : 1} 
Object { a=1} 

>>> [foo] == [foo] 
false 

>>> ({a: foo}) == ({a: foo}) 
false 

o eleman karşılaştırma yapmak ve true dönebilmek için bunu yapmak için bir yol var mı demek bile? bunlar yeni ve farklı nesneler için

+12

nesne değişmezleri yeni örnekler oluşturur, iki örneği tanımlamak, aynı başvuruyu paylaşmalarını sağlamaz. – zzzzBov

+0

Eşit olması gereken "iç elemanlar" değil midir? –

cevap

6

{ } ve [ ]new Object ve new Array

ve new Object != new Object (Array ile aynısı) ile aynıdır.

iki arbitary nesnelerin içeriği "aynı" olduğunu daha sonra aynı bazı değeri için hızlı (ama yavaş) düzeltme

JSON.parse(o) === JSON.parse(o)

daha zarif bir çözüm olacaktır olup olmadığını bilmek istiyorsanız (denenmemiş) eşit işlev tanımlamak için

var equal = function _equal(a, b) { 
    // if `===` or `==` pass then short-circuit 
    if (a === b || a == b) { 
    return true; 
    } 
    // get own properties and prototypes 
    var protoA = Object.getPrototypeOf(a), 
     protoB = Object.getPrototypeOf(b), 
     keysA = Object.keys(a), 
     keysB = Object.keys(b); 

    // if protos not same or number of properties not same then false 
    if (keysA.length !== keysB.length || protoA !== protoB) { 
    return false; 
    } 
    // recurse equal check on all values for properties of objects 
    return keysA.every(function (key) { 
    return _equal(a[key], b[key]); 
    }); 
}; 

equals example

Uyarı:, tüm girişlerde "işleyen" bir eşitlik işlevi yazmak zordur, bazı ortak gelenler (null == undefined) === true ve (NaN === NaN) === false işlevlerinden hiçbirini etkilemez.

Çapraz tarayıcı sorunlarıyla uğraşmadım, sadece ES5'in var olduğunu varsaydım.

+0

'! =='! == '!= ';-) –

+0

Bu işlevin yama için çok şey var. Örneğin. 'eşit ({}, {}) === yanlış '. Ayrıca, sanırım "_equal" ile tekrarlamak istiyorsunuz. – davin

+0

@davin '_equal' yalnızca bir sözleşmedir ve' {} 've' [] 'i zarifçe nasıl kullanacağımı bilmiyorum. Bu aynı zamanda “Object.create (foo), Object.create (bar))' ın doğru veya yanlış olması sorusunu sorar. – Raynos

0

Çünkü javascript nesne değişmezleri aynı işaretçileri paylaşmıyor. Bunun yerine her biri için yeni bir işaretçi oluşturulur. Aşağıdaki örneği inceleyelim:

>>> ({a : 1}) == ({a : 1}) 
false 

... ama ...

>>> obj = ({a : 1}); 
Object 

>>> obj == obj 
true 

obj edebî nesneye { a : 1 } bir göstericidir. Bu nedenle, bu işaretler, onları karşılaştırırken aynı oldukları için çalışır.

0

Farklı nesneleri karşılaştırıyorsunuz. Eğer dizi eşitlik test etmek istiyorsanız

>>> var a = [1,2] var b = [1,2] 
>>> a == b 
false 
>>> a == a 
true 

bazı kütüphane kullanımı ya da sadece Testi kendiniz yazmak isteyebilirsiniz.