Hoy noté que Chrome 49 ya no sale NaN
cuando escribes {}+{}
en la consola. En su lugar, genera la cadena [object Object][object Object]
.
¿Por qué es esto? ¿Ha cambiado el idioma?
javascript
google-chrome
Filip Haglund
fuente
fuente
var e = {}; e.toString()
y verá lo que quiero decirRespuestas:
Las devtools de Chrome ahora envuelven automáticamente todo lo que comienza
{
y termina}
en un par de paréntesis implícito ( 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(…)
.¿Por qué?
No lo sé, peropodría adivinar que reduce la confusión para los novatos que no saben sobre el bloque literal 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 ).
fuente
{a:1}),({b:2}
debería arrojar un error, no producir un objeto.)
en caso de que esté en un comentario, por ejemplo,{a:3} // :-}
podría producir un objeto.Si usted choca con la flecha hacia arriba después de comprobar esto, se dará cuenta de que en lugar de
{} + {}
Muestra({} + {})
, que da lugar"[object Object][object Object]"
.En comparación, en Firefox,
{} + {}
todavía se muestraNaN
, pero si lo hace({} + {})
también se muestra"[object Object][object Object]"
.Entonces, parece que Chrome agrega el paréntesis circundante automáticamente cuando ve esta operación.
fuente
{} + {}
cuando no se "desinfecta"({} + {})
se trata como+ {}
porque{}
se analiza como un bloque vacío.{}
es solo un bloque de código vacío y se ignora, dejándonos con+{}
, que es un objeto unario+
y vacío. inicializador+
forzará su argumento a número, lo que implica convertir el objeto en un primitivo (que terminará siendo untoString
en este caso, lo que da como resultado"[object Object]"
), y así obtenemos+"[object Object]"
cuál esNaN
porque"[object Object]"
no se puede convertir a un número válido.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, ahorrándonos la molestia de escribir laboriosamente estos 2 caracteres difíciles
o=
o0,
antes de pegar Object Literals en la consola:{
;{wat:1}),({wat:2}
Finalmente es un error nuevamente.{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 menciona @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.
Lo anterior debe ser lo mismo que
Lo siguiente se trata correctamente como un bloque ... ¡porque tiene un comentario delante!
Asi es esto:
Este es un objeto:
Esto es un error
Asi es esto:
Esto esta bien:
undefined
asi es esto:
El siguiente se interpreta correctamente como un objeto golpeado en la posición de expresión con una forma en
0,
que generalmente nos aseguramos sin ambigüedades de que tenemos una expresión en lugar de una declaración.No entiendo por qué envuelven el valor en parens. JS tiene algunas decisiones de diseño ridículas, pero tratar de hacer 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
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!
fuente
{foo:1}
y{foo:1}//
producir lo mismo. En Chrome JS REPL no lo hacen. REPL está haciendo más que solo evaluar JS. Está procesando las cadenas y decidiendo diferentes cosas.var x = eval('{a:1}')
En JavaScript válido, x es ahora 1, no el objeto más intuitivo {a: 1}. Sí, eso es raro, pero no puedes cambiar el idioma porque hace cosas raras. Todo lo que no sean cadenas JSON se interpreta como JavaScript y se evalúa. Escribir0,
antes de pegar el JSON no es difícil, alternativamente, estaría contento con una advertencia de que la cadena se interpretó como un objeto en lugar de JavaScript por conveniencia.