online habilitar gratis depurar debugger debug consola chrome activar abrir javascript google-chrome

habilitar - depurar javascript online



¿Por qué{}+{} ya no es NaN en la consola de Chrome? (3)

A partir de Chrome 54 con respecto a la consola:

Desafortunadamente, agregué la cita de Clippy. La consola no brinda información sobre lo que ha hecho por usted.

Las nuevas reglas son increíblemente simples y nos ahorran la molestia de escribir laboriosamente estos 2 caracteres difíciles o= o 0, antes de pegar Object Literals en la consola:

  • Si tiene un código que comienza con: espacios en blanco opcionales, (no se permiten comentarios) seguido de un { ;
  • y ese código podría interpretarse como un objeto;
  • y ese objeto no es seguido por ningún otro código, a menos que:
  • el código después del primer objeto es un operador binario,
  • entonces puede haber tantas operaciones como desee incluyendo agrupaciones
  • siempre que el operador final tenga un objeto literal en la posición derecha;
  • y ese objeto final no se ha agrupado en parens
  • y ese código no termina con punto y coma
  • y no hay comentarios siguiendo el código (se permiten comentarios internos siempre que no estén en la posición inicial o final)
  • entonces y solo entonces su JavaScript (que puede o no ser un código válido) se volverá a incorporar como un Objeto válido. No se le informará que su código ha sido reinterpretado.

{wat:1}),({wat:2} finalmente vuelve a ser un error.

{let i=0;var increment=_=>i++} está correctamente permitido, finalmente, que es una buena manera de hacer cierres.

Sin embargo, lo siguiente es incorrectamente un objeto, esto es solo una conveniencia como lo mencionó @Bergi, ¡interpreta a JS incorrectamente para ayudarlo! La especificación dice que es un bloque con una declaración etiquetada "foo" con un literal 1 que no está asignado a nada.

{foo:1}

Lo anterior debe ser lo mismo que

if(1) { foo: 1 }

Lo siguiente se trata correctamente como un bloque ... ¡porque tiene un comentario delante!

//magic comment {foo:1}

Asi es esto:

{foo:1} //also magic

Este es un objeto:

{foo: //not so magic comment 1}

Esto es un error

//not so magic comment {foo:1}.foo

Asi es esto:

{foo:1}.foo

Esto esta bien:

1..wat

undefined

asi es esto:

[''foo''][0]

El siguiente se interpreta correctamente como un objeto golpeado en la posición de expresión con un 0, que generalmente es cómo nos aseguramos inequívocamente de que tenemos una expresión en lugar de una declaración.

0,{foo:1}.foo

No entiendo por qué envuelven el valor en parens. JS tiene algunas decisiones de diseño ridículas, pero tratar de que se comporte mejor en esta situación no es realmente una opción, la consola necesita ejecutar JS correctamente, y debemos estar seguros de que Chrome no solo adivina que cree que realmente quería decir que hiciera algo más.

Si no le gustan los operadores de coma, puede usar la asignación

x = {foo:1}.foo

Porque tal como está

{} + {} + {}

"[object Object][object Object][object Object]"

;{} + {} + {}

"NaN[object Object]"

Loco y constante con lo que puedo lidiar ... loco e inconsistente no, gracias!

Hoy noté que Chrome 49 ya no genera NaN cuando escribe {}+{} en la consola. En su lugar, genera la cadena [object Object][object Object] .

¿Por qué es esto? ¿Ha cambiado el idioma?


Las herramientas de Chrome ahora envuelven automáticamente todo lo que comienza con { y termina con } en un par de paréntesis implícitos ( ver código ), para forzar su evaluación como una expresión. De esa manera, {} crea un objeto vacío ahora. Puede ver esto si vuelve al historial ( ), la línea anterior estará contenida en (…) .

¿Por qué? No lo sé, pero podría adivinar que reduce la confusión para los novatos que no saben sobre el bloque-vs-objeto-literal, y también es más útil si solo quieres evaluar una expresión.

Y de hecho ese es el razonamiento, como se discutió en el error 499864 . Pura conveniencia. Y porque el nodo REPL también lo tenía ( ver código ).


Si presiona la flecha hacia arriba después de verificar esto, notará que en lugar de {} + {} muestra ({} + {}) , que da como resultado "[object Object][object Object]" .

En comparación, en Firefox, {} + {} todavía muestra NaN , pero si lo hace ({} + {}) también muestra "[object Object][object Object]" .

Entonces, parece que Chrome agrega el paréntesis circundante automáticamente cuando ve esta operación.