Kami sering menggunakan pola kode berikut dalam kode JavaScript kami
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Apakah ada cara pengecekan yang memiliki efek yang sama?
Menurut beberapa forum dan literatur, hanya mengatakan berikut ini harus memiliki efek yang sama.
if (some_variable)
{
// Do something with some_variable
}
Sayangnya, Firebug mengevaluasi pernyataan seperti itu sebagai kesalahan saat runtime ketika some_variable
tidak terdefinisi, sedangkan yang pertama baik-baik saja untuk itu. Apakah ini hanya perilaku Firebug (yang tidak diinginkan) atau apakah memang ada perbedaan antara kedua cara itu?
javascript
null
undefined
Tomas Vana
sumber
sumber
if(some_variable) { ... }
tidak akan mengeksekusi jikasome_variable
inifalse
atau0
atau ...Jawaban:
Anda harus membedakan antara kasus:
undefined
atau tidak dideklarasikan . Anda akan mendapatkan kesalahan jika Anda mengakses variabel yang tidak dideklarasikan dalam konteks apa pun selaintypeof
.Variabel yang telah dideklarasikan tetapi tidak diinisialisasi adalah
undefined
.Properti tidak terdefinisi , seperti
someExistingObj.someUndefProperty
. Properti tidak terdefinisi tidak menghasilkan kesalahan dan hanya mengembalikanundefined
, yang, ketika dikonversi menjadi boolean, dievaluasi menjadifalse
. Jadi, jika Anda tidak peduli0
danfalse
, menggunakanif(obj.undefProp)
tidak apa-apa. Ada idiom umum berdasarkan fakta ini:yang berarti "jika
obj
memiliki propertiprop
, tetapkan kevalue
, atau tetapkan nilai defaultdefautValue
".Beberapa orang menganggap perilaku ini membingungkan, dengan alasan bahwa ini mengarah pada kesalahan yang sulit ditemukan dan merekomendasikan untuk menggunakan
in
operator sebagai gantinyasumber
undefined
.typeof
mengembalikan string. Jadivar myVar; typeof(myVar)==undefined
pengembalianfalse
tidaktrue
.Saya pikir cara paling efisien untuk menguji "nilai adalah
null
atauundefined
" adalahJadi dua baris ini setara:
Catatan 1
Seperti disebutkan dalam pertanyaan, varian pendek mengharuskan yang
some_variable
telah dinyatakan, jika tidak ReferenceError akan dibuang. Namun dalam banyak kasus penggunaan Anda dapat menganggap bahwa ini aman:periksa argumen opsional:
periksa properti pada objek yang ada
Di sisi lain
typeof
dapat menangani variabel global yang tidak dideklarasikan (hanya mengembalikanundefined
). Namun kasus-kasus ini harus dikurangi seminimal mungkin untuk alasan yang baik, seperti dijelaskan Alsciende.Catatan 2
Varian ini - bahkan lebih pendek - tidak setara:
begitu
Catatan 3
Secara umum disarankan untuk menggunakan
===
bukan==
. Solusi yang diusulkan adalah pengecualian untuk aturan ini. The JSHint sintaks checker bahkan menyediakaneqnull
pilihan untuk alasan ini.Dari panduan gaya jQuery :
sumber
== null
adalah imho yang paling efisien untuk menguji 'null or undefined' (yang merupakan topik pertanyaan). Ini sama sekali tidak jarang (digunakan 43 kali dalam jQuery 1.9.1), karena sangat sering Anda tahu bahwa variabel dideklarasikan - atau Anda menguji properti dari objek yang ada sepertiif( o.foo == null)
.window.someProperty == null
. Untuk variabel lokal, Anda dapat dengan mudah memastikannya dinyatakan: alih-alih menulisif (...) {var local = ""}
tulisvar local; if (...) { local = ""; }
Memeriksa null dengan persamaan normal juga akan mengembalikan true untuk undefined.
if (window.variable == null) alert('variable is null or undefined');
sumber
NaN
dari persamaan perbedaan tidak pernah bisa diharapkan samaDalam standar JavaScript yang lebih baru seperti ES5 dan ES6 bisa Anda katakan
semua return false, yang mirip dengan pemeriksaan Python tentang variabel kosong. Jadi jika Anda ingin menulis logika kondisional di sekitar variabel, katakan saja
di sini "null" atau "string kosong" atau "tidak terdefinisi" akan ditangani secara efisien.
sumber
null
danundefined
, nilai-nilai palsu lainnya harus kembali benar!0
,NaN
. Ini untuk ketika Anda ingin menangkap kebenaran suatu objek tanpa menyimpan referensi ke objek sehingga Anda dapat menyimpannya daripada beberapa objek yang berpotensi besar. FYI ini juga setara dengan!!value
, yang pertama!
meniadakan kebenaran, dan yang kedua meniadakannya lagi.if (var)
yang akan dilemparkan ke boolean, jadi pada dasarnya sama sekali tidak berguna ...Boolean(undefined)
berfungsi, mencoba dengan variabel yang tidak terdefinisi tidak berfungsi, dan itulah inti dari melakukan pemeriksaan untuk null atau tidak terdefinisi. Ini:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
melempar ReferenceError yang mengatakan "ReferenceError: undeclareVarName tidak didefinisikan"Jika Anda mencoba dan mereferensikan variabel yang tidak dideklarasikan, kesalahan akan terjadi pada semua implementasi JavaScript.
Properti objek tidak tunduk pada kondisi yang sama. Jika properti objek belum ditentukan, kesalahan tidak akan terjadi jika Anda mencoba dan mengaksesnya. Jadi dalam situasi ini Anda dapat mempersingkat:
untuk
Dengan mengingat hal ini, dan fakta bahwa variabel global dapat diakses sebagai properti dari objek global (
window
dalam hal browser), Anda dapat menggunakan yang berikut untuk variabel global:Dalam lingkup lokal, selalu berguna untuk memastikan variabel dideklarasikan di bagian atas blok kode Anda, ini akan menghemat penggunaan berulang
typeof
.sumber
if (myObj.some_property != null)
untuk mendapatkan perilaku yang setara.Pertama, Anda harus sangat jelas tentang apa yang Anda uji. JavaScript memiliki semua jenis konversi implisit untuk membuat Anda marah, dan dua jenis pembanding kesetaraan:
==
dan===
.Suatu fungsi,
test(val)
yang mengujinull
atauundefined
harus memiliki karakteristik berikut:Mari kita lihat ide mana di sini yang benar-benar lulus dari tes kami.
Pekerjaan ini:
Ini tidak berfungsi:
Saya membuat entri jsperf untuk membandingkan kebenaran dan kinerja dari pendekatan ini. Hasil tidak meyakinkan untuk saat ini karena belum ada cukup berjalan di berbagai browser / platform. Silakan luangkan waktu sebentar untuk menjalankan tes di komputer Anda!
Saat ini, tampaknya
val == null
tes sederhana memberikan kinerja terbaik. Ini juga yang terpendek. Tes dapat dinegasikan keval != null
jika Anda ingin melengkapi.sumber
ini adalah satu-satunya kasus yang
==
harus digunakan:sumber
val != null
untuk yang sebaliknya, hanya satu=
dan karena per @Yukulele itu HANYA yang digunakan,==
Anda akan tahu apa yang dilakukannya ketika Anda melihatnya.Karena tidak ada jawaban yang lengkap dan benar, saya akan mencoba merangkum:
Secara umum, ungkapan:
tidak dapat disederhanakan, karena
variable
mungkin tidak dideklarasikan sehingga menghilangkantypeof(variable) != "undefined"
akan menghasilkan ReferenceError. Tetapi, Anda dapat menyederhanakan ekspresi sesuai dengan konteksnya :Jika
variable
adalah dunia , Anda dapat menyederhanakan ke:Jika bersifat lokal , Anda mungkin dapat menghindari situasi ketika variabel ini tidak dideklarasikan, dan juga menyederhanakan untuk:
Jika memang properti objek , Anda tidak perlu khawatir tentang ReferenceError:
sumber
navigator
bagian dariwindow
? Saat kami mendapat pengecualiannavigator is not defined
, bisakah kami menggunakanwindow.navigator != null
tes ini?Anda bisa memeriksa apakah variabel memiliki nilai atau tidak. Berarti,
Jika Anda tidak tahu apakah ada variabel (artinya, jika dideklarasikan), Anda harus memeriksa dengan typeof operator. misalnya
sumber
Saya telah melakukan ini dengan menggunakan metode ini
simpan id dalam beberapa variabel
kemudian gunakan jika kondisinya
sumber
Ini adalah contoh acara yang sangat langka di mana dianjurkan untuk digunakan
==
sebagai gantinya===
. Ekspresisomevar == null
akan mengembalikan true untukundefined
dannull
, tetapi false untuk yang lainnya (kesalahan jika variabel tidak dideklarasikan).Menggunakan
!=
akan membalik hasilnya, seperti yang diharapkan.Editor modern tidak akan memperingatkan untuk menggunakan
==
atau!=
dengan operatornull
, karena ini hampir selalu perilaku yang diinginkan.Perbandingan paling umum:
Cobalah sendiri:
sumber
Seperti yang disebutkan dalam salah satu jawaban, Anda bisa beruntung jika Anda berbicara tentang variabel yang memiliki cakupan global. Seperti yang Anda ketahui, variabel yang Anda tetapkan secara global cenderung ditambahkan ke objek windows. Anda dapat mengambil keuntungan dari fakta ini jadi katakanlah Anda sedang mengakses variabel yang disebut bleh, cukup gunakan operator pembalik ganda (!!)
Ini akan menghasilkan false sementara bleh belum dinyatakan DAN diberi nilai.
sumber
inilah cara lain menggunakan metode Array mencakup () :
sumber
apa pun yyy Anda tidak terdefinisi atau nol, itu akan mengembalikan true
Iya
tidak
sumber
Buka alat Pengembang di browser Anda dan coba saja kode yang ditunjukkan pada gambar di bawah ini.
sumber
Untuk memahami, Mari kita menganalisis apa yang akan menjadi nilai yang dikembalikan oleh Javascript Engine ketika mengkonversi undefined, null, dan '' (An string kosong juga). Anda dapat langsung memeriksa yang sama di konsol pengembang Anda.
Anda dapat melihat semua konversi menjadi false, artinya ketiganya menganggap 'tidak adanya' dengan javascript. Jadi, Anda tidak perlu memeriksa ketiganya secara eksplisit dalam kode Anda seperti di bawah ini.
Saya juga ingin menunjukkan satu hal lagi.
Apa yang akan menjadi hasil dari Boolean (0)?
Tentu saja salah. Ini akan membuat bug dalam kode Anda ketika 0 adalah nilai yang valid dalam hasil yang Anda harapkan. Jadi pastikan Anda memeriksa ini ketika Anda menulis kode.
sumber
Mirip dengan apa yang Anda miliki, Anda dapat melakukan sesuatu seperti
if (some_variable === undefined || some_variable === null) { do stuff }
sumber
Pengujian nullity (
if (value == null)
) atau non-nullity (if (value != null)
) kurang verbose daripada pengujian status definisi variabel.Selain itu, pengujian
if (value)
(atauif( obj.property)
) untuk memastikan keberadaan variabel Anda (atau properti objek) gagal jika didefinisikan denganfalse
nilai boolean . Kaisar peringatan :)sumber
Kedua nilai dapat dengan mudah dibedakan dengan menggunakan operator perbandingan ketat:
Contoh kerja di:
http://www.thesstech.com/tryme?filename=nullandundefined
Kode sampel:
sumber
Jika tujuan pernyataan if adalah untuk memeriksa
null
atauundefined
menilai sebelum memberikan nilai ke variabel, Anda dapat menggunakan Operator Nullish Coalescing , akhirnya tersedia di JavaScript, meskipun dukungan browser terbatas. Menurut data dari caniuse , hanya 48,34% browser yang didukung (per April 2020).Ini akan memastikan bahwa variabel akan ditugaskan ke string kosong (atau nilai default lainnya) jika
some_variable
adanull
atauundefined
.Operator ini paling cocok untuk kasus penggunaan Anda, karena tidak mengembalikan nilai default untuk jenis nilai falsy lainnya seperti
0
dan''
.sumber
Anda harus mendefinisikan fungsi dari formulir ini:
sumber
Dalam ES5 atau ES6 jika Anda perlu memeriksanya beberapa kali, Anda dapat melakukannya:
sumber
Dengan Ramda, Anda cukup melakukan
R.isNil(yourValue)
Lodash dan perpustakaan pembantu lainnya memiliki fungsi yang sama.sumber