obtener busquen agregar javascript type-conversion

busquen - obtener href javascript



{}-0 VS({}-0) en JavaScript (3)

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 :

  1. 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.
  2. Se puede interpretar como ({} - 0) , donde {} se interpreta como un objeto vacío, y - es el operador de resta (por lo que 0 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