2010-05-22 13 views
11

¿Por qué el operador de igualdad devuelve falso en el primer caso?Comparación de fechas de 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 

¿Por qué?

Respuesta

28

Dado que las fechas están incorporados en los objetos, y no primitives, se realiza una comprobación de igualdad utilizando las referencias de objetos.

En este caso, los objetos a y b no son el mismo objeto, por lo que la prueba falla.
se puede ver la misma utilizando

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

Mediante el uso de .getTime o .valueOf que está convirtiendo el valor de los objetos en una primitiva, y estos siempre se comparan por valor y no por referencia.

Si usted quiere hacer una comparación del valor de las dos fechas también hay una forma más oscura de hacer esto

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

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

En este caso el unario + operador hace que el motor de javascript para llamar a los objetos valueOf método - y entonces son dos primitivas las que se están comparando.

+0

Este es un truco interesante, ¡gracias! – Art

+0

No estoy seguro de que lo llamaría un truco realmente. –

+0

Solo para estar seguro - Me refería a la declaración "+ a == + b". – Art

0

Compare two dates with JavaScript

dates.compare (a, b)

El hecho es que la comparación entre los dos objetos no funciona correctamente:/

+0

No realmente. La comparación entre dos objetos funciona como se especifica. –

0

Si crea dos relojes y los establece a la vez, tiene dos relojes.

Si cambia la hora en un reloj, no cambiará la hora en el otro reloj.

Para comparar o ordenar Fechas, reste una de la otra. El valor de un objeto Date, utilizado en una expresión matemática, es su marca de tiempo.

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

-1

Lo siento chicos, pero esto es idiota ... especialmente lo de tener dos relojes.

==, por definición, compara VALUES, mientras que === compara referencias. Decir que == falla para los no primitivos rompe la propia estructura sintáctica del lenguaje. Por supuesto, === fallaría en el ejemplo inicial, ya que las dos fechas son claramente dos punteros distintos a dos espacios de memoria distintos, pero, según la propia definición de la especificación JS, == debería devolver TRUE para la comparación de dos fechas cuyo valor es el mismo punto en el tiempo.

Sin embargo, otra razón por la que odio JS ...

sentimos a despotricar, pero esto acaba de iniciar mi trasero durante una hora.

Como un aparte, puede usar valueOf() para forzar la comparación de los valores, y que devolverá verdadero ... es redundante con == pero funciona.

+0

de acuerdo, como WTF – Art

+1

No sabe de qué está despotricando ... La distinción entre == y === tiene nada que ver con valores vs refs, == simplemente establece que la máquina virtual debe usar un conjunto de reglas de coerción claramente definidas cuando los dos operandos son de tipos diferentes, mientras que === indica que no se producirá dicha coerción. –

Cuestiones relacionadas