può spiegare come l'espressione JavaScript:Come esattamente l'espressione JavaScript [1 [{}]] analizza?
[1 [{}]]
analizza/Esamina? In Firefox, Chrome, Konqueror e Rhino, sembra che crei un array con un singolo elemento, undefined
. Tuttavia, non capisco perché.
In Firefox:
[1 [{}]].toSource()
produce
[(void 0)]
Sostituzione 1 con altri valori JavaScript sembra produrre lo stesso risultato.
Aggiornamento: Penso di aver capito ora. codeka, Adrian e CMS hanno chiarito le cose. Per quanto riguarda la serie, ho provato a camminare attraverso ECMAScript 5.
1 [{}]
è una funzione di accesso di proprietà, quindi è coperto in §11.2.1.baseReference
è il risultato della valutazione1
, quindi ancora1
.baseValue = GetValue(baseReference) == 1
.- A
GetValue
(§8.7.1),Type(1)
non èReference
(associazione di un nome risolto), quindi ritorno 1. propertyNameReference
è risultato della valutazione{}
, quindi un oggetto vuoto.propertyNameValue = GetValue(propertyNameReference) == {}
- A
CheckObjectCoercible(baseValue)
(§9.10), si ritorna (il numero è coercibile con l'oggetto). propertyNameString = ToString(propertyNameValue)
- A
ToString
(§9.8), restituireToString(ToPrimitive({}, hint String))
- A
ToPrimitive
(§9.1), return risultato dell'oggetto di[[DefaultValue]]
, passandoPreferredType
(stringa). - A
[[DefaultValue]]
(§8.12.8), lasciare toString essere risultato di[[Get]]
con argomentotoString
. - Questo è definito in §15.2.4.2 per restituire
"[object " + [[Class]] + "]"
, dove[[Class]]
è "Oggetto" per il prototipo dell'oggetto predefinito. - Poiché è disponibile un numero chiamante
toString
, viene chiamato con l'argomentothis
{}
. - Restituisce un valore di tipo
Reference
, il cui valore di base èBaseValue
(1) e il cui nome di riferimento èpropertyNameString
("[object Object]"
).
Quindi passiamo all'inizializzatore di array (§11.1.4) e costruiamo un array di elementi singolo con il risultato.
Io non sono sicuro perché questo sarebbe valido JavaScript ... in modo da ottenere risultati imprevedibili del motore * * cercando di gestirlo. ... mi sembra normale. –
@Nick, sono anche scettico sul fatto che sia valido JS e sono disposto ad accettare la possibilità che sia semplicemente un comportamento indefinito. Tuttavia, il fatto che tutti e 4 i motori (che hanno implementazioni separate) la analizzano allo stesso modo è almeno interessante. –
@Matthew - La risposta di Adrian è una buona spiegazione del comportamento in quei 4 browser, non penso ancora che '[object]' sia un accessor valido ... quindi sarebbe ancora su ogni engine su come gestire questo caso. Questo è un caso limite, e non riesco a trovare nulla nella specifica 3.1 che dice come dovrebbe essere gestito esattamente. –