Telah diketahui oleh semua orang bahwa sintaks JavaScript sangat menyedihkan.
Ayo pasang gambar dulu
Kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
{} + []; // 0
[] + {}; // "[objek objek]"
{} + [] == [] + {}; // PALSU
({} + [] == [] + {}); // BENAR
Jebakan sintaks yang menyakitkan mungkin hanya hal yang aneh seperti JavaScript.
Saya percaya bahwa sebagian besar sepatu anak -anak yang tidak mempelajari kompiler javascript tidak dapat dipahami sama sekali. (Setidaknya saya merasa luar biasa)
Kemudian, saya pergi ke gadis Baidu untuk sementara waktu dan kemudian tiba -tiba menyadarinya!
Mari kita lihat kode ini:
Salinan kode adalah sebagai berikut:
{
A: 1
}
Saya percaya bahwa sebagian besar sepatu anak -anak akan berpikir bahwa ini adalah pengukuran langsung dari objek pada pandangan pertama.
Bagaimana dengan kode ini?
Salinan kode adalah sebagai berikut:
{
var a = 1;
}
Akankah browser meminta kesalahan sintaks?
Jelas tidak! Jika Anda memikirkannya dengan cermat, kami akan memahami bahwa ini adalah blok pernyataan.
Salinan kode adalah sebagai berikut:
if (isNumber) {
var a = 1;
}
Berbicara tentang ini, Anda mungkin telah menemukan bahwa akan ada ambiguitas dalam JavaScript dimulai dengan {.
Jadi bagaimana kompiler JavaScript berurusan dengan ambiguitas ini?
Untuk mengatasi masalah ini, metode ECMA sangat sederhana dan kasar: ketika memarsing sintaks, jika sebuah pernyataan dimulai dengan "{", itu hanya ditafsirkan sebagai blok pernyataan.
Ini benar -benar cara yang curang!
Karena mereka semua blok pernyataan, mengapa {A: 1} tidak memiliki kesalahan sintaks?
Bahkan, di sini, A dipahami oleh parser sebagai tag. Tag digunakan untuk mencocokkan istirahat dan melanjutkan pernyataan untuk lompatan arah.
Oleh karena itu, metode penulisan seperti itu akan melempar pengecualian:
Salinan kode adalah sebagai berikut:
{
A: function () {}
}
Karena function () {} bukan deklarasi fungsi, juga bukan ekspresi fungsi.
Pada titik ini, setiap orang harus memiliki konsep dasar tentang perlakuan aneh {}. Mari kita lihat kembali beberapa kalimat yang disebutkan di awal artikel:
Salinan kode adalah sebagai berikut:
{} + []; // 0
[] + {}; // "[objek objek]"
{} + [] == [] + {}; // PALSU
({} + [] == [] + {}); // BENAR
Yang pertama, karena {} adalah blok pernyataan, kode dapat dipahami sebagai:
Salinan kode adalah sebagai berikut:
if (1) {}
+[]
Jadi nilai pengembalian adalah 0.
Kedua, karena {} tidak ada di awal pernyataan, itu adalah objek normal kuantitas langsung, array kosong dan objek kosong ditambahkan secara langsung, dan "[objek objek]" dikembalikan.
Saya memahami artikel pertama dan kedua, tetapi tidak perlu menjelaskan artikel ketiga.
Pasal 4, karena dimulai dengan (), {} pertama diuraikan ke dalam kuantitas langsung objek, sehingga kedua formula tersebut sama dan mengembalikan true.