2010-05-22 1 views
11

Perché l'operatore di uguaglianza restituisce false nel primo caso?Confronto data JavaScript

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 
alert(a == b); // <- returns false 
alert(a.getTime() == b.getTime()); // returns true 

Perché?

risposta

28

Da date sono incorporati negli oggetti, e non primitives, viene eseguito un controllo di uguaglianza utilizzando i riferimenti agli oggetti.

In questo caso, gli oggetti a e b non sono lo stesso oggetto e pertanto il test ha esito negativo.
si può vedere la stessa utilizzando

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); //false 

Utilizzando .getTime o .valueOf si sta convertendo il valore degli oggetti in un primitivo, e questi sono sempre rispetto per valore piuttosto che per riferimento.

Se si vuole fare un confronto con il valore di due date c'è anche un modo più oscura per fare questo

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 

alert(+a == +b); //true 

In questo caso l'+ operatore unario costringe il motore JavaScript di chiamare gli oggetti valueOf metodo - e quindi sono due primitive che vengono confrontate.

+0

Questo è un trucco interessante, grazie! – Art

+0

Non sono sicuro che lo chiamerei davvero un hack. –

+0

Solo per essere sicuro - mi riferivo a "+ a == + b". – Art

0

Compare two dates with JavaScript

dates.compare (a, b)

Il fatto è che il confronto tra i due oggetti non funziona correttamente:/

+0

Non proprio. Il confronto tra due oggetti funziona come specificato. –

0

Se si creano due orologi e li si impostano entrambi allo stesso tempo, si hanno due orologi.

Se si modifica l'ora in un orologio, non verrà modificata l'ora dell'altro orologio.

Per confrontare o ordinare le date, sottrarre l'una dall'altra. Il valore di un oggetto Date, utilizzato in un'espressione matematica, è il suo timestamp.

function compareDates (a, b) {return a-b};

-1

Mi dispiace ragazzi, ma questo è un idiota ... specialmente il fatto di avere due orologi.

==, per definizione confronta VALUES, mentre === confronta i riferimenti. Dire che == fallisce per i non primitivi rompe la struttura sintattica del linguaggio. Ovviamente, === fallirebbe nell'esempio iniziale, poiché le due date sono chiaramente due puntatori distinti a due distinti spazi di memoria, ma, per la stessa definizione della specifica JS, == dovrebbe restituire VERO per il confronto di due date il cui valore è lo stesso nel tempo.

Ancora un altro motivo che odio JS ...

Spiace sproloquio, ma questo solo preso a calci il mio culo per un'ora.

Come parte, è possibile utilizzare valueOf() per forzare il confronto dei valori e che restituirà true ... è ridondante con == ma funziona.

+0

concordato, tale WTF – Art

+1

Non si sa cosa si sta biascicando di ... La distinzione tra == e === ha niente a che fare con valori vs refs, == afferma semplicemente che la VM dovrebbe usare un insieme di regole di coercizione chiaramente definite quando i due operandi sono di tipi diversi, mentre === afferma che nessuna coercizione di questo tipo deve verificarsi. –