2012-08-17 36 views
7

en una publicación reciente en http://wtfjs.com/. Un autor escribe siguiente sin explicación que pasa a ser cierto.¿Por qué es "0 === -0" verdadero en JavaScript?

0 === -0 //returns true 

Mi comprensión acerca del operador === es que devuelve verdadero si los operandos apuntan al mismo objeto.

Además, - operator devuelve una referencia al valor negativo del operando. Con esta regla, 0 y -0 no deberían ser lo mismo.

Entonces, ¿por qué es 0 === -0?

Respuesta

5

De hecho, 0 y -0 no son lo mismo, incluso en el nivel de bit. Sin embargo, hay un caso especial implementado para +/- 0 por lo que se comparan como iguales.

El operador === se compara por valor cuando se aplica a números primitivos.

+0

Se complementan, no son lo mismo, pero de a dos están. –

+0

@ColeJohnson Me olvidé del complemento a dos por un momento. Javascript usa el punto flotante IEEE de 64 bits para números, que es el complemento de uno. –

+0

por lo que parece que el caso especial se maneja en JavaScript. – riship89

6

=== no siempre significa apuntar al mismo objeto. Lo hace en objetos, pero en tipos de valores, compara el valor. Por lo tanto, cómo funciona esto:

var x = 0; 
var y = 0; 
var isTrue = (x === y); 
document.write(isTrue); // true 

JavaScript estándar utilizado de punto flotante IEEE, donde 0 y -0 son dos números diferentes, sin embargo, los estados ECMAScript standard el analizador debe interpretar 0 y -0 como el mismo:

§5.2 (página 12)

Las operaciones matemáticas tales como suma, resta, negación, multiplicación, división y las funciones matemáticas definidas más adelante en esta cláusula siempre deben entenderse como calcular resultados matemáticos exactos en números reales matemáticos, que sí no incluye infinitos y no incluyen un cero negativo que se distingue del cero positivo. Los algoritmos en este estándar que modelan la aritmética de coma flotante incluyen pasos explícitos , donde sea necesario, para manejar infinitos y cero firmado y para realizar el redondeo. Si se aplica una operación o función matemática a un número de coma flotante, debe entenderse que se aplica al valor matemático exacto representado por ese número de coma flotante; tal número de coma flotante debe ser finito, y si es +0 o -0 entonces el valor matemático correspondiente es simplemente 0.

+0

así, ¿es un caso especial implementado en JavaScript o números negativos son evaluados utilizando el complemento a 2? – riship89

+0

@ hrishikeshp19 IEEE estándar de coma flotante es el complemento a excepción de esto. –

+0

No es solo el analizador sintáctico. 'a === -a' donde a es 0 devuelve verdadero. –

3

Los números primitivos no son objetos. Está haciendo una comparación de valores de los números, no una comparación de identidad de los objetos.

cero positivo es igual a cero negativo.

Este es el algoritmo de comparación para el operador ===

Si Tipo (x) es el número, entonces

  • Si x es NaN, devuelve falso.

  • Si y es NaN, devuelve falso.

  • Si x es igual Valor de número que y, devuelve verdadero.

  • Si x es +0 e y es -0, devuelve verdadero.

  • Si x es -0 y y es +0, devuelve verdadero.

  • Devolver falso.

+2

+1. Porque -0 es en realidad un número en JavaScript (debido a que todos los números realmente son flotantes IEEE-754, que pueden representar cero negativo). Simplemente se define como igual a 0 para que la gente no se vuelva loca. –