oggetto rispetto ==
o !=
(o ===
o !==
) vengono confrontati in base a se si riferiscono allo stesso oggetto . Se è così, sono uguali; se no, non sono uguali.
Ma gli operatori di confronto relazionali (>
, <
, >=
, e <=
) non confrontare i riferimenti, che costringono gli operandi in qualcosa che possono confrontare: i numeri o stringhe.
Nel caso di new Object()
, che la coercizione finisce per creare una stringa : "[object Object]"
. E, naturalmente, "[object Object]" >= "[object Object]"
è vero perché sono uguali.
Così in effetti, cosa si sta effettivamente facendo è:
console.log(a == b); //false
console.log(String(a) > String(b)); //false
console.log(String(b) > String(a)); //false
console.log(String(a) >= String(b)); //true
console.log(String(b) >= String(a)); //true
... ma nota che altri tipi di oggetti costringono in modo diverso, perché gli oggetti possono scegliere il modo in cui costringono in questa situazione (in cui la specifica preferisce un numero su una stringa) implementando/sovrascrivendo valueOf
. Ad esempio, gli oggetti Date
costringono a un numero quando si applica un operatore relazionale a loro se l'altro operando può anche costringere al numero. Così si può utilizzare in modo affidabile dt1 > dt2
per vedere se dt1
rappresenta una data/ora dopo dt2
— ma può non uso dt1 == dt2
per controllare se dt1
e dt2
(due separati Date
oggetti) hanno la stessa data/ora in loro, perché ==
controllerà per vedere se sono lo stesso oggetto invece. Il che ci porta a questo po 'di divertimento:
var dt1 = new Date(2016, 5, 23);
var dt2 = new Date(2016, 5, 23);
console.log(dt1 < dt2); // false
console.log(dt1 > dt2); // false
console.log(dt1 == dt2); // false!
Tutti i dettagli scabrosi possono essere trovati nella specifica:
fonte
2016-06-23 17:36:56
IIRC, oggetti sono memorizzati per riferimento, quindi è fondamentalmente guardando l'indirizzo dell'oggetto in memoria. –
@JeremyJackson: No, non lo è. –
I confronti di disuguaglianza che stai facendo stanno confrontando la stringa '[oggetto oggetto]' con se stessa, poiché tali confronti costringono gli operandi a una stringa in questo caso. Quelle stringhe non sono più grandi o meno l'una rispetto all'altra, ma sono maggiori o uguali o uguali o inferiori o uguali a. –