busquen - obtener href javascript
{}-0 VS({}-0) en JavaScript (3)
Esta pregunta ya tiene una respuesta aquí:
En la consola de Chrome JavaScript, ¿por qué el ajuste de la declaración {} - 0
entre paréntesis cambia el valor devuelto?
{} - 0 // Returns -0
({} - 0) // Returns NaN
Parece increíblemente extraño que envolver una sola declaración entre paréntesis altera el valor contenido. ¿Que me estoy perdiendo aqui?
Hay dos interpretaciones posibles de la línea {} - 0
:
- Se puede interpretar como
{}; -0
{}; -0
, donde{}
se interpreta como una instrucción de bloque vacío, y-
es el operador de negación unario (por lo que-0
es solo "cero negativo"). El valor de esto cuando se evalúa es el valor de la última declaración, que es -0. - Se puede interpretar como
({} - 0)
, donde{}
se interpreta como un objeto vacío, y-
es el operador de resta (por lo que0
se resta de{}
).
En su primera línea, esto es ambiguo, por lo que elegirá la primera interpretación. En la segunda línea, la primera interpretación no es válida (ya que una instrucción de bloque nunca puede ser parte de una expresión, que está forzando con los paréntesis).
{} - 0
: aquí {}
es solo un bloque vacío que no hace nada, por lo que -0
devuelto por la consola.
({} - 0)
: aquí {}
es una parte de la expresión y se convierte en un número. No hay un método valueOf()
definido en ese objeto vacío y, al convertirlo a un número, toString()
al método toString()
que devuelve algo como el object Object
para {}
. Entonces este object Object
cadena object Object
se convierte en un número y le da NaN
ya que en realidad no es un número. Entonces, tenemos
({} - 1)
-> (''object Object'' - 1)
-> (NaN - 1)
Y todo con NaN
da NaN
. Eso es lo que finalmente ves en la consola.
{} - 0
se interpreta: {} empty block statement
y - 0 negative zero
({} - 0)
all inside ()
se interpreta como una expresión, empty object - 0 = NaN