Ketika Anda melakukannya 0[0], juru bahasa JS akan mengubah yang pertama 0menjadi Numberobjek dan kemudian mencoba mengakses [0]properti objek itu undefined.
Tidak ada kesalahan sintaks karena sintaks akses properti 0[0]diperbolehkan oleh tata bahasa dalam konteks ini. Struktur ini (menggunakan istilah dalam tata bahasa Javascript) adalah NumericLiteral[NumericLiteral].
Bagian yang relevan dari tata bahasa dari bagian A.3 dari spesifikasi ES5 ECMAScript adalah ini:
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
Jadi, seseorang dapat mengikuti grammer melalui perkembangan ini:
MemberExpression [ Expression ]
PrimaryExpression [ Expression ]
Literal [ Expression ]
NumericLiteral [ Expression ]
Dan, demikian Expressionpula pada akhirnya bisa NumericLiteraljadi setelah mengikuti tata bahasa, kita melihat bahwa ini diperbolehkan:
NumericLiteral [ NumericLiteral ]
Yang berarti itu 0[0]adalah bagian tata bahasa yang diizinkan dan karenanya tidak ada SyntaxError.
Kemudian, pada waktu proses Anda diizinkan untuk membaca properti yang tidak ada (hanya akan dibaca sebagai undefined) selama sumber yang Anda baca adalah objek atau memiliki konversi implisit ke objek. Dan, literal numerik memang memiliki konversi implisit menjadi objek (objek Angka).
Ini adalah salah satu fitur Javascript yang sering tidak dikenal. Jenis Number, Booleandan Stringdalam Javascript biasanya disimpan secara internal sebagai primitif (bukan objek yang lengkap). Ini adalah representasi penyimpanan yang kompak dan tidak dapat diubah (mungkin dilakukan dengan cara ini untuk efisiensi implementasi). Namun, Javascript ingin Anda dapat memperlakukan objek primitif ini seperti objek dengan properti dan metode. Jadi, jika Anda mencoba mengakses properti atau metode yang tidak didukung secara langsung pada primitif, maka Javascript akan memaksa primitif untuk sementara menjadi tipe objek yang sesuai dengan nilai yang ditetapkan ke nilai primitif.
Saat Anda menggunakan sintaks mirip objek pada primitif seperti 0[0], interpreter mengenali ini sebagai akses properti pada primitif. Responsnya terhadap hal ini adalah dengan mengambil 0primitif numerik pertama dan memaksanya menjadi objek full-blown Numberyang kemudian dapat mengakses [0]properti. Dalam kasus khusus ini, [0]properti pada objek Angka undefineditulah sebabnya itulah nilai yang Anda dapatkan 0[0].
Berikut adalah artikel tentang konversi otomatis dari primitif menjadi objek untuk tujuan menangani properti:
Kehidupan Rahasia Primitif Javascript
Berikut adalah bagian yang relevan dari spesifikasi ECMAScript 5.1:
9.10 CheckObjectCoercible
Melempar TypeError jika nilainya adalah undefinedatau null, jika tidak, dikembalikan true.

11.2.1 Pengakses Properti
- Biarkan baseReference menjadi hasil evaluasi MemberExpression.
- Biarkan baseValue menjadi GetValue (baseReference).
- Biarkan propertyNameReference menjadi hasil evaluasi Expression.
- Biarkan propertyNameValue menjadi GetValue (propertyNameReference).
- Panggil CheckObjectCoercible (baseValue).
- Biarkan propertyNameString menjadi ToString (propertyNameValue).
- Jika produksi sintaksis yang sedang dievaluasi terdapat dalam kode mode ketat, biarkan ketat menjadi benar, kalau tidak biarkan ketat menjadi salah.
- Kembalikan nilai tipe Reference yang nilai dasarnya adalah baseValue dan nama referensinya adalah propertyNameString, dan yang flag mode ketatnya ketat.
Bagian operasi untuk pertanyaan ini adalah langkah # 5 di atas.
8.7.1 GetValue (V)
Ini menjelaskan bagaimana ketika nilai yang diakses adalah referensi properti, ia memanggil ToObject(base)untuk mendapatkan versi objek dari primitif apa pun.
9.9 ToObject
Ini menjelaskan bagaimana Boolean, Numberdan Stringprimitif dikonversi ke bentuk objek dengan properti internal [[PrimitiveValue]] disetel sesuai.
Sebagai tes yang menarik, jika kodenya seperti ini:
var x = null;
var a = x[0];
Itu masih tidak akan memunculkan SyntaxError pada waktu parse karena ini secara teknis adalah sintaks yang legal, tetapi itu akan memunculkan TypeError saat runtime ketika Anda menjalankan kode karena ketika logika Pengakses Properti di atas diterapkan ke nilai x, itu akan memanggil CheckObjectCoercible(x)atau memanggil ToObject(x)yang mana akan menampilkan TypeError jika xadalah nullatau undefined.
true[0]atau""[0]