2011-10-10 19 views
5

che segue è fatto in Firebug:In Javascript, perché [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) falso?

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

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

ho pensato javscript ha qualche regola che dice che, se un oggetto o array ha gli stessi riferimenti agli stessi elementi, allora sono uguali?

Ma anche se io dico

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

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

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

C'è un modo per fare in modo che esso possa fare il confronto elemento e tornare true?

+12

letterali oggetto creano nuove istanze, definendo due istanze non li fanno condividere lo stesso riferimento. – zzzzBov

+0

non sono gli "elementi interni" che devono essere uguali? –

risposta

6

{ } e [ ] sono uguali a new Object e new Array

E new Object != new Object (idem con Array) perché sono nuovi e diversi oggetti.

Se volete sapere se il contenuto di due oggetti arbitrari è la "stessa" per un certo valore della stessa poi un rapido (ma lento) correzione è

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

Una soluzione più elegante sarebbe definire una funzione uguale (non testata)

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

Attenzione: scrivere una funzione di uguaglianza che "funziona" su tutti gli input è difficile, alcuni trucchi comuni sono (null == undefined) === true e che nessuno dei due ha previsto per la mia funzione.

Né ho mai avuto problemi con i browser, ho appena pensato che ES5 esista.

+0

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

+0

Hai molto da correggere con quella funzione. Per esempio. 'uguale ({}, {}) === falso'. Inoltre, penso che tu voglia recitare con '_equal'. – davin

+0

@davin '_equal' è solo una convenzione e non so come gestire' {} 'e' [] 'elegantemente. Ciò pone anche la domanda se 'equal (Object.create (foo), Object.create (bar))' debba essere vero o falso. – Raynos

0

È perché i valori letterali oggetto javascript non condividono gli stessi puntatori. Invece viene creato un nuovo puntatore per ognuno. Si consideri il seguente esempio:

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

... ma ...

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

>>> obj == obj 
true 

obj è un puntatore all'oggetto letterale { a : 1 }. Quindi questo funziona perché i puntatori sono gli stessi quando li confronti

0

Stai comparando diversi oggetti.

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

Se si desidera verificare l'uguaglianza array che si potrebbe desiderare di utilizzare qualche libreria o semplicemente scrivere il test da soli.