¿Puede explicar cómo la expresión de JavaScript:¿Cómo exactamente analiza la expresión de JavaScript [1 [{}]?
[1 [{}]]
analiza/evalúa? En Firefox, Chrome, Konqueror y rhino, parece crear una matriz con un solo elemento, undefined
. Sin embargo, no entiendo por qué.
En Firefox:
[1 [{}]].toSource()
produce
[(void 0)]
Sustitución 1 con otros valores que JavaScript para producir el mismo resultado.
Actualización: Creo que ahora entiendo. Codeka, Adrian y CMS aclararon cosas. En cuanto a la norma, traté de caminar a través de ECMAScript 5.
1 [{}]
es una propiedad de acceso, por lo que está cubierto de §11.2.1.baseReference
es el resultado de la evaluación de1
, por lo que todavía1
.baseValue = GetValue(baseReference) == 1
.- En
GetValue
(§8.7.1),Type(1)
no esReference
(unión un nombre resuelto), de modo de vuelta 1. propertyNameReference
es resultado de evaluar{}
, por lo que un objeto vacío.propertyNameValue = GetValue(propertyNameReference) == {}
- En
CheckObjectCoercible(baseValue)
(§9.10), volvemos (Número es objeto coercible). propertyNameString = ToString(propertyNameValue)
- En
ToString
(§9.8), volverToString(ToPrimitive({}, hint String))
- En
ToPrimitive
(§9.1), resultado retorno de objeto de[[DefaultValue]]
, pasandoPreferredType
(cadena). - En
[[DefaultValue]]
(§8.12.8), deje que String sea el resultado de[[Get]]
con el argumentotoString
. - Esto se define en §15.2.4.2 para devolver
"[object " + [[Class]] + "]"
, donde[[Class]]
es "Objeto" para el prototipo de objeto predeterminado. - Dado que hay un
toString
llamable, lo llamamos con el argumentothis
siendo{}
. - Devuelve un valor de tipo
Reference
, cuyo valor base esBaseValue
(1) y cuyo nombre de referencia espropertyNameString
("[object Object]"
).
Luego, vamos a Array initializer (§11.1.4), y construimos una matriz de elemento único con el resultado.
No estoy seguro de por qué esto sería válida JavaScript ... para que pueda obtener resultados impredecibles del motor * * tratando de manejarlo. ..me parece un estado normal –
@Nick, también soy escéptico de que sea JS válido, y estoy dispuesto a aceptar la posibilidad de que sea simplemente un comportamiento indefinido. Sin embargo, el hecho de que los 4 motores (que tienen implementaciones separadas) lo analicen de la misma manera es al menos interesante. –
@Matthew - La respuesta de Adrián es una muy buena explicación del comportamiento en esos 4 navegadores, pero aún no creo que '[object]' sea un accesorio válido ... así que todavía depende de cada motor ver cómo funciona manejaría este caso. Sin embargo, este es un caso marginal, y no puedo encontrar nada en la especificación 3.1 que diga cómo debe manejarse exactamente. –