Yang sedikit aneh adalah bahwa bahasa JavaScript sebenarnya memiliki dua nilai yang mewakili "non": tidak ditentukan dan nol. Kenapa begitu?
1. Kesamaan
Dalam JavaScript, menetapkan variabel untuk tidak terdefinisi atau nol, jujur, hampir tidak ada perbedaan.
Salinan kode adalah sebagai berikut:
var a = tidak terdefinisi;
var a = null;
Dalam kode di atas, variabel A masing -masing ditugaskan untuk tidak terdefinisi dan nol, dan kedua metode penulisan ini hampir setara.
Tidak terdefinisi dan nol secara otomatis dikonversi menjadi false dalam pernyataan IF, dan operator kesetaraan bahkan secara langsung melaporkan bahwa keduanya sama.
Salinan kode adalah sebagai berikut:
if (! Undefined)
console.log ('tidak terdefinisi false');
// tidak ditentukan salah
if (! null)
console.log ('null is false');
// nol itu salah
tidak terdefinisi == NULL
// BENAR
Kode di atas menunjukkan betapa miripnya perilaku keduanya!
Karena makna dan penggunaan yang tidak ditentukan dan nol serupa, mengapa Anda perlu menetapkan dua nilai seperti itu pada saat yang sama? Dart, alternatif JavaScript untuk Google, dengan jelas menetapkan bahwa hanya ada nol dan tidak ada yang tidak terdefinisi!
2. Alasan Historis
Baru -baru ini, ketika saya membaca buku baru "Speaking Javascript", saya secara tidak sengaja menemukan jawaban untuk pertanyaan ini!
Ternyata ini terkait dengan sejarah JavaScript. Ketika Javascript lahir pada tahun 1995, pada awalnya ditetapkan seperti Java, hanya NULL yang ditetapkan sebagai nilai yang menunjukkan "tidak ada".
Menurut tradisi bahasa C, NULL dirancang untuk secara otomatis beralih ke 0.
Salinan kode adalah sebagai berikut:
Nomor (NULL)
// 0
5 + NULL
// 5
Namun, perancang Javascript Brendan Eich berpikir bahwa ini tidak cukup, karena dua alasan.
Pertama, NULL diperlakukan sebagai objek seperti di Java.
Salinan kode adalah sebagai berikut:
tipe null
// "objek"
Namun, tipe data JavaScript dibagi menjadi dua kategori: tipe primitif dan sintetis (kompleks).
Kedua, versi awal JavaScript tidak termasuk mekanisme penanganan kesalahan. Brendan Eich berpikir bahwa jika NULL secara otomatis beralih ke 0, tidak mudah untuk menemukan kesalahan.
Oleh karena itu, Brendan Eich merancang lain yang tidak terdefinisi.
3. Desain awal
Versi asli JavaScript membedakannya seperti ini: NULL adalah objek yang mewakili "tidak ada", yaitu 0 ketika dikonversi ke nilai numerik; .
Salinan kode adalah sebagai berikut:
Angka (tidak ditentukan)
// nan
5 + tidak terdefinisi
// nan
4. Penggunaan saat ini
Namun, perbedaan di atas dengan cepat terbukti tidak layak dalam praktik. Saat ini, nol dan tidak terdefinisi pada dasarnya identik dengan hanya sedikit perbedaan.
Null berarti "tidak ada objek", yaitu, seharusnya tidak ada nilai di sana. Penggunaan khas adalah:
(1) Sebagai parameter suatu fungsi, parameter fungsi bukan objek.
(2) sebagai titik akhir dari rantai prototipe objek.
Salinan kode adalah sebagai berikut:
Object.getPrototypeOf (Object.Prototype)
// null
Tidak ditentukan berarti "nilai yang hilang", yang berarti harus ada nilai di sini, tetapi belum didefinisikan. Penggunaan khas adalah:
(1) Ketika suatu variabel dinyatakan tetapi tidak memiliki penugasan, itu setara dengan tidak ditentukan.
(2) Saat memanggil fungsi, parameter yang harus disediakan tidak disediakan, dan parameternya sama dengan tidak terdefinisi.
(3) Objek tidak memiliki atribut yang ditetapkan ke nilai, dan nilai atribut tidak ditentukan.
(4) Ketika fungsi tidak mengembalikan nilai, tidak ditentukan dikembalikan secara default.
Salinan kode adalah sebagai berikut:
var i;
Saya // tidak ditentukan
fungsi f (x) {console.log (x)}
f () // tidak ditentukan
var o = objek baru ();
op // tidak ditentukan
var x = f ();
x // tidak ditentukan