Czy możesz wyjaśnić, jak wyrażenie JavaScript:Jak dokładnie analizowane jest wyrażenie JavaScript [1 [{}]]?
[1 [{}]]
analizuje/ocenia? W przeglądarkach Firefox, Chrome, Konqueror i rhino wydaje się tworzyć tablicę z jednym elementem, undefined
. Jednak nie rozumiem dlaczego.
Firefox:
[1 [{}]].toSource()
produkuje
[(void 0)]
zastępując 1 z innymi wartościami JavaScript wydaje uzyskując ten sam wynik.
Aktualizacja: Myślę, że teraz rozumiem. Codeka, Adrian i CMS wyjaśniły rzeczy. Jeśli chodzi o normy, starałem się iść przez ECMAScript 5.
1 [{}]
jest właściwością Accessor, więc jest pokryta §11.2.1.baseReference
jest wynikiem oceny1
, więc nadal1
.baseValue = GetValue(baseReference) == 1
.- Na
GetValue
(§8.7.1)Type(1)
nieReference
(zdecydowanym nazwa wiązania), a więc powrót 1. propertyNameReference
jest wynikiem oceny{}
, tak więc pusty obiektu.propertyNameValue = GetValue(propertyNameReference) == {}
- Na
CheckObjectCoercible(baseValue)
(§9.10), zwracamy (Liczba jest obiektowo-uboczna). propertyNameString = ToString(propertyNameValue)
- Na
ToString
(§9.8), powrótToString(ToPrimitive({}, hint String))
- Na
ToPrimitive
(§9.1), wynik powrotnej obiektu[[DefaultValue]]
, przechodzącPreferredType
(string). - Przy
[[DefaultValue]]
(§8.12.8), niech toString będzie wynikiem[[Get]]
z argumentemtoString
. - To jest zdefiniowane w §15.2.4.2, aby zwrócić
"[object " + [[Class]] + "]"
, gdzie[[Class]]
jest "Obiektem" dla domyślnego prototypu obiektu. - Ponieważ istnieje wywoływalny
toString
, nazywamy go argumentemthis
będącym{}
. - Zwraca wartość typu
Reference
, której podstawową wartością jestBaseValue
(1) i której nazwa podana topropertyNameString
("[object Object]"
).
Następnie przechodzimy do inicjatora Array (§11.1.4) i tworzymy tablicę pojedynczych elementów z wynikiem.
Nie jestem pewien, dlaczego miałoby to być ważne JavaScript ... więc masz nieprzewidywalne rezultaty silnika * * próbuje go obsłużyć. Stan ... jest normalny dla mnie. –
@Nick, jestem także sceptyczny, że to jest prawidłowy JS i jestem skłonny zaakceptować możliwość, że jest to po prostu nieokreślone zachowanie. Jednak fakt, że wszystkie 4 silniki (które mają osobne implementacje) parsuje ją w ten sam sposób, jest co najmniej interesujący. –
@Matthew - odpowiedź Adriana jest całkiem dobrym wyjaśnieniem zachowania w tych 4 przeglądarkach, nadal nie uważam, że '[obiekt]' jest prawidłowym akcesorium ... więc nadal będzie to zależało od każdego silnika poradziłbym sobie z tą sprawą. Jest to jednak poważny przypadek i nie mogę znaleźć niczego w specyfikacji 3.1, która mówi, jak należy dokładnie to zrobić. –