Bunu yaptığınızda 0[0], JS yorumlayıcısı ilkini 0bir Numbernesneye dönüştürür ve sonra [0]o nesnenin özelliğine erişmeye çalışır undefined.
0[0]Bu bağlamda özellik erişimi sözdizimine dil grameri tarafından izin verildiği için sözdizimi hatası yoktur . Bu yapı (Javascript dilbilgisindeki terimleri kullanarak) NumericLiteral[NumericLiteral].
ES5 ECMAScript spesifikasyonunun A.3 bölümündeki dil gramerinin ilgili kısmı şudur:
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
Yani, bu ilerlemeyle grameri takip edebilirsiniz:
MemberExpression [ Expression ]
PrimaryExpression [ Expression ]
Literal [ Expression ]
NumericLiteral [ Expression ]
Ve benzer Expressionşekilde NumericLiteral, dilbilgisini takip ettikten sonra sonunda öyle olabilir , buna izin verildiğini görüyoruz:
NumericLiteral [ NumericLiteral ]
Bu 0[0], dilbilgisinin izin verilen bir parçası olduğu ve dolayısıyla SyntaxError olmadığı anlamına gelir .
Daha sonra, çalışma zamanında undefined, okuduğunuz kaynak bir nesne olduğu veya bir nesneye örtük bir dönüşümü olduğu sürece, var olmayan (yalnızca olarak okunacak ) bir özelliği okuyabilirsiniz . Ve sayısal bir değişmez, gerçekten de bir nesneye (bir Number nesnesi) örtük bir dönüşüme sahiptir.
Bu, Javascript'in genellikle bilinmeyen özelliklerinden biridir. Türleri Number, Booleanve StringJavaScript genellikle ilkel (değil tam gelişmiş nesneler) olarak saklanır. Bunlar kompakt, değişmez depolama temsilleridir (muhtemelen uygulama verimliliği için bu şekilde yapılmıştır). Ancak Javascript, bu ilkelleri özelliklere ve yöntemlere sahip nesneler gibi ele alabilmenizi ister. Dolayısıyla, ilkelde doğrudan desteklenmeyen bir özelliğe veya yönteme erişmeye çalışırsanız, Javascript geçici olarak ilkeli, değeri ilkel değerine ayarlanmış uygun bir nesne türüne zorlayacaktır.
İlkel gibi bir ilkelde nesne benzeri bir sözdizimi kullandığınızda 0[0], yorumlayıcı bunu bir ilkelde özellik erişimi olarak tanır. Buna cevabı, ilk 0sayısal ilkeli almak ve Numberonu, daha sonra [0]özelliğe erişebileceği tam gelişmiş bir nesneye zorlamaktır . Bu özel durumda, [0]Number nesnesindeki özellik undefinedbu yüzden aldığınız değerdir 0[0].
Burada, özelliklerle uğraşmak amacıyla bir ilkelin bir nesneye otomatik olarak dönüştürülmesiyle ilgili bir makale yer almaktadır:
Javascript İlkellerinin Gizli Yaşamı
ECMAScript 5.1 spesifikasyonunun ilgili bölümleri şunlardır:
9.10 CheckObjectCoercible
Değer undefinedveya ise TypeError atar null, aksi takdirde döndürür true.

11.2.1 Mülk Erişimcileri
- BaseReference, MemberExpression'u değerlendirmenin sonucu olsun.
- BaseValue GetValue (baseReference) olsun.
- PropertyNameReference, İfade değerlendirmesinin sonucu olsun.
- PropertyNameValue GetValue (propertyNameReference) olsun.
- CheckObjectCoercible (baseValue) öğesini çağırın.
- PropertyNameString'in ToString (propertyNameValue) olmasına izin verin.
- Değerlendirilen sözdizimsel üretim katı mod kodunda yer alıyorsa, katı doğru olsun, aksi takdirde katı yanlış olsun.
- Temel değeri baseValue olan ve başvurulan adı propertyNameString olan ve katı mod bayrağı katı olan Reference türünde bir değer döndürür.
Bu soru için etkin bir kısım yukarıdaki 5. adımdır.
8.7.1 GetValue (V)
Bu, erişilen değerin bir özellik referansı olduğunda, ToObject(base)herhangi bir ilkelin nesne sürümünü almayı nasıl çağırdığını açıklar .
9.9 Hedef
Bu Boolean, buna göre ayarlanmış [[İlkelDeğer]] dahili özellik ile nasıl Numberve Stringilkellerin bir nesne formuna dönüştürüldüğünü açıklar .
İlginç bir test olarak, kod böyle olsaydı:
var x = null;
var a = x[0];
Bu teknik olarak yasal sözdizimi olarak hala ayrıştırma anda SyntaxError atmak olmaz, ancak kodu çalıştırdığınızda Mülkiyet Erişimciler mantığı yukarıda değerine uygulandığında çünkü zamanında bir TypeError atmak istiyorum x, bu arayacak CheckObjectCoercible(x)veya çağrı ToObject(x)hangi eğer her ikisi de bir TypeError atacağım xolduğu nullveya undefined.
true[0]or""[0]