Saya telah menulis JavaScript cukup lama sekarang, dan saya tidak pernah punya alasan untuk menggunakannya null
. Tampaknya itu undefined
selalu lebih disukai dan melayani tujuan yang sama secara terprogram. Apa sajakah alasan praktis untuk menggunakan null
daripada undefined
?
javascript
null
undefined
Jimmy Cuadra
sumber
sumber
document.getElementById()
itu yang dapat kembalinull
tetapi tidakundefined
, jadi dalam kasus tersebut mengapa Anda menguji pengembaliannyaundefined
? (Tentu, ini akan berhasil jika Anda menggunakan==
daripada===
, tapi tetap saja, mengapa Anda sengaja menguji hal yang salah?)document.getElementById('does-not-exist')
). Variabelvar a;
dan fungsi mengembalikan nilai default ke tidak ditentukan. Di masa lalu, null berada dalam cakupan global sehingga menggunakannya memperlambat eksekusi dan membuat saya lebih memilih jenis falsy lainnya (false, '', 0) daripada referensi gratis. Saya pribadi menghindari null kecuali jika ada alasan kuat yang sebaliknya karena saya menganggapnya lebih sederhana, yang umumnya lebih baik.Jawaban:
Null dan undefined pada dasarnya adalah dua nilai berbeda yang memiliki arti yang sama. Satu-satunya perbedaan adalah pada konvensi bagaimana Anda menggunakannya di sistem Anda . Seperti yang telah disebutkan beberapa orang, beberapa orang menggunakan null untuk arti "tidak ada objek" di mana Anda terkadang mendapatkan objek sementara tidak ditentukan berarti tidak ada objek yang diharapkan (atau bahwa ada kesalahan). Masalah saya dengan itu adalah sepenuhnya sewenang-wenang, dan sama sekali tidak perlu.
Meskipun demikian, ada satu perbedaan utama - variabel yang tidak diinisialisasi (termasuk parameter fungsi di mana tidak ada argumen yang diteruskan, antara lain) selalu tidak terdefinisi.
Itulah sebabnya dalam kode saya, saya tidak pernah menggunakan null kecuali sesuatu yang tidak saya kendalikan mengembalikan null (pencocokan regex misalnya). Keindahan ini adalah menyederhanakan banyak hal. Saya tidak pernah perlu memeriksa apakah x === undefined || x === null. Dan jika Anda terbiasa menggunakan == atau hanya menggunakan if (x) .... Hentikan.
!x
akan mengevaluasi ke true untuk string kosong, 0, null, NaN - yaitu hal-hal yang mungkin tidak Anda inginkan. Jika Anda ingin menulis javascript yang tidak jelek, selalu gunakan triple sama dengan === dan jangan pernah menggunakan null (gunakan undefined sebagai gantinya). Ini akan membuat hidup Anda lebih mudah.sumber
===
atau!==
. JS adalah bahasa yang sangat ekspresif jika Anda tahu cara menggunakannya.null
/undefined
dikotomi diperlukan karena versi awal JS tidak memilikihasOwnProperty
atauin
operatornya. Sekarang ya, saya tidak begitu mengerti mengapa salah satu dari mereka tidak dihapuskan di ES6 atau proposal ES7 yang pernah saya lihat.Saya tidak benar-benar punya jawaban, tetapi menurut Nicholas C. Zakas , halaman 30 dari bukunya " JavaScript Profesional untuk Pengembang Web " :
sumber
undefined
berarti bencana telah terjadi. Hanya imho.var myVar;
dan secara eksplisit memeriksa nilainyaundefined
untuk menentukan apakah itu telah diisi dengan referensi objek di lain waktu. Maksud saya adalah ini sepenuhnya akademis - Anda dapat melakukannya dengan cara apa pun, dan siapa pun yang memberi nasihat dengan satu cara hanya mendorong konvensi mereka sendiri.undefined
dannull
. Ini masih sangat mengganggu. Saya menghindari menetapkan variabelnull
hanya untuk mengurangi jumlahnull
pengujian tambahan .==
perbandingan (sebagai lawan===
) masuk akal:v == null
(atauv == undefined
) akan memeriksa nol atau tidak ditentukan.Pada akhirnya, karena keduanya
null
danundefined
memaksa ke nilai yang sama (Boolean(undefined) === false && Boolean(null) === false
), Anda secara teknis dapat menggunakan keduanya untuk menyelesaikan pekerjaan. Namun, ada cara yang benar, IMO.Biarkan penggunaan
undefined
untuk kompiler JavaScript.undefined
digunakan untuk mendeskripsikan variabel yang tidak mengarah ke referensi. Ini adalah sesuatu yang akan dijaga oleh kompiler JS untuk Anda. Pada waktu kompilasi, mesin JS akan menetapkan nilai semua variabel yang diangkat keundefined
. Saat mesin menginjak kode dan nilai tersedia, mesin akan menetapkan nilai masing-masing ke variabel masing-masing. Untuk variabel-variabel yang nilainya tidak ditemukan, variabel-variabel tersebut akan terus mempertahankan referensi ke primitifundefined
.Hanya gunakan null jika Anda secara eksplisit ingin menunjukkan nilai variabel sebagai "tidak ada nilai".
Seperti yang dinyatakan @ com2gz:
null
digunakan untuk mendefinisikan sesuatu yang kosong secara terprogram.undefined
dimaksudkan untuk mengatakan bahwa referensi tersebut tidak ada. Sebuahnull
nilai memiliki referensi didefinisikan "apa-apa". Jika Anda memanggil properti yang tidak ada dari suatu objek, maka Anda akan mendapatkanundefined
. Jika saya akan membuat properti itu dengan sengaja dikosongkan, maka itu harus dilakukannull
agar Anda tahu bahwa itu sengaja.TLDR; Jangan gunakan
undefined
primitif. Ini adalah nilai yang akan diatur secara otomatis oleh kompiler JS untuk Anda saat Anda mendeklarasikan variabel tanpa penetapan atau jika Anda mencoba mengakses properti objek yang tidak memiliki referensi. Di sisi lain, gunakannull
jika dan hanya jika Anda secara sengaja ingin variabel memiliki "tidak ada nilai".Saya tidak pernah secara eksplisit mengatur apa pun ke tidak terdefinisi (dan saya belum menemukan ini di banyak basis kode yang pernah saya gunakan). Juga, saya jarang menggunakan
null
. Satu-satunya waktu yang saya gunakannull
adalah ketika saya ingin menunjukkan nilai argumen menjadi fungsi yang tidak memiliki nilai, yaitu:sumber
undefined adalah di mana tidak ada gagasan tentang hal itu; itu tidak memiliki tipe, dan tidak pernah direferensikan sebelumnya dalam lingkup itu; null adalah tempat sesuatu diketahui ada, tetapi tidak memiliki nilai.
sumber
Setiap orang memiliki cara pengkodean sendiri dan semantik internal mereka sendiri, tetapi selama bertahun-tahun saya telah menemukan ini sebagai saran paling intuitif yang saya berikan kepada orang-orang yang mengajukan pertanyaan ini: jika ragu, lakukan apa yang dilakukan JavaScript .
Katakanlah Anda bekerja dengan properti objek seperti opsi untuk plugin jQuery ... tanyakan pada diri Anda nilai apa yang diberikan JavaScript pada properti yang belum ditentukan - jawabannya adalah
undefined
. Jadi dalam konteks ini, saya akan menginisialisasi jenis hal ini dengan 'tidak terdefinisi' agar konsisten dengan JavaScript (untuk variabel, Anda dapat melakukannyavar myVar;
daripadavar myVar = undefined;
).Sekarang katakanlah Anda melakukan manipulasi DOM ... nilai apa yang diberikan JavaScript ke elemen yang tidak ada? Jawabannya adalah
null
. Ini adalah nilai yang akan saya inisialisasi jika Anda membuat variabel placeholder yang nantinya akan menyimpan referensi ke elemen, fragmen dokumen, atau serupa yang terkait dengan DOM.Jika Anda bekerja dengan JSON, maka kasus khusus perlu dibuat: untuk nilai properti tidak terdefinisi, Anda harus menyetelnya ke
""
ataunull
karena nilaiundefined
tidak dianggap sebagai format JSON yang tepat.Dengan ini dikatakan, seperti yang telah diungkapkan poster sebelumnya, jika Anda menemukan bahwa Anda menginisialisasi sesuatu dengan
null
atauundefined
lebih dari sekali di bulan biru, maka mungkin Anda harus mempertimbangkan kembali bagaimana Anda melakukan pengkodean aplikasi Anda.sumber
Anda mungkin mengadopsi konvensi yang disarankan di sini, tetapi sebenarnya tidak ada alasan yang tepat untuk itu. Itu tidak digunakan secara cukup konsisten untuk menjadi bermakna.
Untuk membuat konvensi berguna, Anda harus tahu dulu bahwa fungsi yang dipanggil mengikuti konvensi. Kemudian Anda harus secara eksplisit menguji nilai yang dikembalikan dan memutuskan apa yang harus dilakukan. Jika Anda tidak terdefinisi , Anda dapat berasumsi bahwa terjadi beberapa jenis kesalahan yang diketahui oleh fungsi yang dipanggil . Tetapi jika terjadi kesalahan, dan fungsi mengetahuinya, dan berguna untuk mengirimkannya ke lingkungan yang lebih luas, mengapa tidak menggunakan objek kesalahan? yaitu melempar kesalahan?
Jadi pada akhirnya, konvensi praktis tidak berguna dalam hal lain selain program yang sangat kecil di lingkungan yang sederhana.
sumber
Properti berguna dalam null yang tidak ditentukan tidak memenuhi syarat:
Saya gunakan
null
ketika saya ingin 'mematikan' nilai numerik, atau untuk menginisialisasi beberapa. Penggunaan terakhir saya adalah memanipulasi transformasi css:Tidak yakin apakah saya harus menggunakan properti ini, pikir ...
sumber
Node dan elemen DOM tidak ditentukan, tetapi mungkin nol.
NextSibling dari anak terakhir dari sebuah elemen adalah null.
PreviousSibling dari anak pertama adalah null.
Referensi document.getElementById bernilai null jika elemen tidak ada dalam dokumen.
Tetapi tidak satu pun dari kasus ini yang nilainya tidak terdefinisi ; tidak ada simpul di sana.
sumber
window.myVar
akan mengembalikan 'tidak terdefinisi jika tidak ada. Ada banyak sekali hal yang mengembalikan 'tidak terdefinisi' di JavaScript, hanya ada banyak hal yang mengembalikan 'null' - semuanya tergantung pada konteksnya.Beberapa orang mengatakan bahwa tidak masalah untuk menginisialisasi objek
null
. Saya hanya ingin menunjukkan bahwa default argumen yang merusak tidak berfungsinull
. Sebagai contoh:Ini membutuhkan
null
pemeriksaan sebelum memanggil fungsi yang mungkin sering terjadi.sumber
Saya sedang mengerjakan pertanyaan yang tepat ini sekarang, dan melihat filosofi berikut:
Bagi saya, pertanyaan ini penting karena siapa pun yang memanggil fungsi yang mengembalikan hasil seharusnya tidak memiliki pertanyaan apakah akan menguji undefined vs null.
Jawaban ini tidak mencoba menjawab:
Menurut pendapat saya, variabel adalah bisnis Anda sendiri dan bukan bagian dari API Anda, dan properti dalam sistem OO mana pun ditentukan dan oleh karena itu harus ditentukan dengan nilai yang berbeda dari yang akan terjadi jika tidak ditentukan (null untuk ditentukan, tidak ditentukan adalah apa yang Anda dapatkan saat mengakses sesuatu yang tidak ada di objek Anda).
sumber
Berikut alasannya:
var undefined = 1
adalah javascript legal, tetapivar null = 1
merupakan kesalahan sintaks. Perbedaannya adalah itunull
adalah kata kunci bahasa, sedangkanundefined
, untuk beberapa alasan, tidak.Jika kode Anda bergantung pada perbandingan
undefined
seolah-olah itu adalah kata kunci (if (foo == undefined)
- kesalahan yang sangat mudah dibuat) yang hanya berfungsi karena tidak ada yang mendefinisikan variabel dengan nama itu. Semua kode itu rentan terhadap seseorang yang secara tidak sengaja atau jahat mendefinisikan variabel global dengan nama itu. Tentu saja, kita semua tahu bahwa mendefinisikan variabel global secara tidak sengaja sama sekali tidak mungkin dalam javascript ...sumber
void 0
alih-alih tidak ditentukan.Hanya ingin menambahkan bahwa dengan penggunaan perpustakaan javascript tertentu, null dan undefined dapat memiliki konsekuensi yang tidak diinginkan.
Misalnya,
get
fungsi lodash , yang menerima nilai default sebagai argumen ke-3:Contoh lain: Jika Anda menggunakan defaultProps di React, jika properti dilewatkan
null
, props default tidak digunakan karena null diinterpretasikan sebagai nilai yang ditentukan . misalnyasumber
Saya sepenuhnya tidak setuju bahwa penggunaan null atau undefined tidak diperlukan. undefined adalah hal yang menjaga seluruh proses rangkaian prototipe tetap hidup. Jadi compiler hanya dengan null tidak dapat memeriksa apakah properti ini sama dengan null, atau tidak ditentukan dalam prototipe titik akhir. Dalam bahasa bertipe dinamis lainnya (fe Python), ini melontarkan pengecualian jika Anda menginginkan akses ke properti yang tidak ditentukan, tetapi untuk bahasa berbasis prototipe, kompilator juga harus memeriksa prototipe induk dan di sini adalah tempat di mana sebagian besar kebutuhan yang tidak ditentukan.
Arti keseluruhan penggunaan null hanyalah mengikat variabel atau properti dengan objek yang tunggal dan memiliki arti kekosongan, serta penggunaan null memiliki tujuan kinerja. 2 kode ini memiliki waktu eksekusi yang berbeda.
sumber
Variabel yang tidak diketahui:
undefined
.Variabel belum diketahui ada nilai:
null
.server_object
,.server_object.errj
. Ini memberitahumu ituundefined
. Itu artinya dia tidak tahu apa itu.server_object.err
. Ini memberitahumu itunull
. Itu berarti Anda mereferensikan variabel yang benar tetapi kosong; oleh karena itu tidak ada kesalahan.Masalahnya adalah ketika Anda mendeklarasikan nama variabel tanpa nilai (
var hello
) js menyatakan bahwaundefined
: variabel ini tidak ada; sedangkan programmer sebagian besar berarti: "Saya belum memberinya nilai", definisinull
.Jadi perilaku default seorang programmer — mendeklarasikan sebuah variabel tanpa nilai sebagai tidak ada — bertentangan dengan js — mendeklarasikannya sebagai tidak ada. Dan selain itu,
!undefined
dan!null
keduanyatrue
begitu sebagian besar pemrogram memperlakukan mereka sebagai setara.Anda tentu saja dapat memastikan bahwa Anda selalu melakukannya
var hello = null
tetapi sebagian besar tidak akan membuang-buang kode mereka untuk memastikan kewarasan tipe dalam bahasa yang sengaja diketik secara longgar, ketika mereka dan!
operator memperlakukan keduanyaundefined
dannull
setara.sumber