2014-09-01 18 views
5

Quindi la domanda è che due stessi oggetti non sono uguali in JavaScript, diciamo:Perché Object()! = Object() in JavaScript?

Object() == Object() 

o anche:

[{a: 1}, {a: 2}].indexOf({a: 1}); //returns -1 not found 

Qual è il motivo di questo strano comportamento?

+2

Quelli sono due oggetti simili, che certamente non sono la stessa cosa. – Musa

+1

Forse questo aiuta: http://stackoverflow.com/questions/201183/how-to-determine-equality-for-two-javascript-objects/16788517 – John

+0

@Musa altri indizi? –

risposta

8

Gli oggetti vengono confrontati per riferimento. E due riferimenti sono uguali solo se puntano allo stesso oggetto.

+0

E 'un comportamento corretto? Abbiamo lo stesso comportamento in altri linguaggi come Python? –

+2

@AfshinMehrabani sì. in Python '' The "is" operatore verifica l'identità dell'oggetto. Python verifica se i due sono realmente lo stesso oggetto (ad esempio, vivono nello stesso indirizzo in memoria).'' – doniyor

+0

Per evitare confusione: In JS Si potrebbe inciampare su 'Object.is', che testerà anche l'identità sugli oggetti, solo rigoroso e non interrotto come' === '... –

2

Gli oggetti sono di riferimento e quando si confrontano due riferimenti restituiscono false.

Il other answer (in Eamon Nerbonne) qui ha un punto molto rilevante:

oggetti sono considerati equivalenti quando

  • Essi sono esattamente uguali a === (String e Number sono scartare primo assicurare 42 equivale a Number(42))
  • oppure entrambi sono le date e hanno lo stesso valueOf()
  • o entrambi sono dello stesso tipo e non nullo e ...
    • non sono oggetti e sono uguali a == (catture numeri/stringhe/booleani)
    • o, proprietà ignorando con undefined valore che avere le stesse proprietà che sono considerate equivalenti ricorsivamente.
1

Lo stesso vale per le matrici ([] === []) //returns false

E Nan è un valore speciale e che non è mai uguale a se stesso.

NaN === NaN //False