Saya menemukan kode berikut:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Saya agak baru mengenal JavaScript, tetapi, dari pertanyaan lain yang saya baca di sini, saya mendapat kesan bahwa kode ini tidak masuk akal.
Anda akan mendapatkan kesalahan jika Anda mengakses variabel yang tidak ditentukan dalam konteks apa pun selaintypeof
.
Pembaruan: Jawaban (kutipan) di atas mungkin menyesatkan. Itu harus mengatakan «variabel yang tidak dideklarasikan» , alih-alih «variabel yang tidak ditentukan» .
Seperti yang saya temukan, dalam jawaban oleh Ryan ♦ , maerics , dan nwellnhof , bahkan ketika tidak ada argumen yang disediakan untuk suatu fungsi, variabelnya untuk argumen selalu dideklarasikan. Fakta ini juga membuktikan salah item pertama dalam daftar di bawah ini.
Dari pemahaman saya, skenario berikut mungkin dialami:
Fungsi dipanggil tanpa argumen, sehingga membuatdata
variabel tidak terdefinisi, dan meningkatkan kesalahandata != null
.Fungsi dipanggil secara khusus dengan
null
(atauundefined
), sebagai argumennya, dalam hal inidata != null
sudah melindungi kode bagian dalam, menjadikannya&& data !== undefined
tidak berguna.Fungsi dipanggil dengan argumen non-nol, dalam hal ini akan melewati keduanya
data != null
dandata !== undefined
.
T: Apakah pemahaman saya benar?
Saya sudah mencoba yang berikut ini, di konsol Firefox:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Saya tidak bisa menemukan kasus di mana data !== undefined
setelahnya data != null
mungkin ada gunanya.
sumber
if (data)
. Ini adalah cara Javascript mnemonic untuk memeriksa apakahdata
variabel bernilai true.undefined
,,null
false, 0, string kosong, array kosong, dan (?) objek tanpa properti bernilai false, sisanya benar.if(data)
berarti dia tidak bisa lulusfalse
atau0
sebagai nilai untukdata
.if(typeof someUndefVar == whatever) -- works
danif(someUnderVar) -- error
.data !== null && data !== undefined
, yang setara dengandata != null
yang setara dengandata != undefined
. Bentuk sebelumnya cenderung disukai karena lebih eksplisit tentang kondisi, sedangkan akan mudah untuk mengabaikan keduanyanull
danundefined
sedang diperiksa dengan dua kondisi selanjutnya.undefined
IMO adalah bau kode. Ini bukan kata kunci yang dilindungi sepertinull
, ini adalah variabel yang tidak terdefinisi. Ini benar-benar valid dan akan memecahkan kode Anda:undefined = 1
Jawaban:
“Variabel tidak terdefinisi” berbeda dari nilainya
undefined
.Variabel tidak terdefinisi:
Variabel dengan nilai
undefined
:Ketika suatu fungsi mengambil argumen, argumen itu selalu dideklarasikan meskipun nilainya demikian
undefined
, sehingga tidak akan ada kesalahan. Anda benar tentang!= null
diikuti oleh!== undefined
menjadi tidak berguna.sumber
data !== null && data !== undefined
akan masuk akal.data != null
akan memeriksa keduanyanull
danundefined
(tapi, yang menarik, hanya untuknull
danundefined
, dan bukan nilai-nilai palsu lainnya).Dalam JavaScript,
null
adalah objek tunggal khusus yang berguna untuk memberi sinyal "tidak ada nilai". Anda dapat mengujinya dengan perbandingan dan, seperti biasa dalam JavaScript, praktik yang baik untuk menggunakan===
operator untuk menghindari paksaan jenis yang membingungkan:Seperti @rynah menyebutkan, "undefined" agak membingungkan dalam JavaScript. Namun, selalu aman untuk menguji apakah
typeof(x)
string "tidak terdefinisi", bahkan jika "x" bukan variabel yang dideklarasikan:Selain itu, variabel dapat memiliki "nilai tidak terdefinisi" jika tidak diinisialisasi:
Menyatukan semuanya, cek Anda akan terlihat seperti ini:
Namun, karena variabel "data" selalu ditentukan karena ini adalah parameter fungsi formal, menggunakan operator "typeof" tidak diperlukan dan Anda dapat dengan aman membandingkan langsung dengan "nilai yang tidak ditentukan".
Cuplikan ini sama dengan mengatakan "jika fungsi dipanggil dengan argumen yang didefinisikan dan bukan nol ..."
sumber
!= null
akan berlaku untuk semua nilai kecualinull
danundefined
, dan kami yakin bahwa variabel ini dideklarasikan.typeof
dalam situasi lain bahkan bisa berbahaya - bagaimana jika Anda salah ketik nama variabel? Itu bisa tidak terdeteksi untuk waktu yang lama karena tidak ada kesalahan.!=
sama sekali, hanya perbandingan ketat!==
,?===
) kecuali Anda benar-benar tahu apa yang Anda lakukan dan ingin perbandingan setelah konversi (==
).undefined
. Juga, Safari di iPad akan melakukan itu dalam keadaan apa pun. Anda bahkan tidak bisadelete window.undefined
.Dalam kasus Anda gunakan
data==null
(yang HANYA berlaku untuk null dan tidak terdefinisi - pada fokus gambar kedua pada baris / kolom null-undefined)Tampilkan cuplikan kode
Di sini Anda memiliki semua ( src ):
jika
== (negasinya ! = )
=== (negasinya ! == )
sumber
Q: Fungsi dipanggil tanpa argumen, sehingga menjadikan data sebagai variabel yang tidak terdefinisi, dan meningkatkan kesalahan pada data! = Null.
A: Ya,
data
akan ditetapkan ke tidak terdefinisi. Lihat bagian 10.5 Instansiasi Pengikatan Deklarasi dari spec. Tetapi mengakses nilai yang tidak ditentukan tidak menimbulkan kesalahan. Anda mungkin membingungkan ini dengan mengakses variabel yang tidak dideklarasikan dalam mode ketat yang memang memunculkan kesalahan.Q: Fungsi dipanggil secara khusus dengan null (atau tidak terdefinisi), sebagai argumennya, dalam hal ini data! = Null sudah melindungi kode bagian dalam, membuat && data! == tidak terdefinisi sia-sia.
Q: Fungsi ini dipanggil dengan argumen non-nol, yang dalam hal ini sepele akan melewatkan kedua data! = Null dan data! == tidak terdefinisi.
A: Benar. Perhatikan bahwa tes berikut ini setara:
Lihat bagian 11.9.3 Algoritma Perbandingan Kesetaraan Abstrak dan bagian 11.9.6 Algoritma Perbandingan Kesetaraan Ketat dari spesifikasi.
sumber
data
tidak akan ada sama sekali, bukannya ditetapkanundefined
. Saya menghargai klarifikasi, dan referensi itu membantu saya memahami dengan lebih baik bagaimana kedua persamaan bekerja.Saya pikir, menguji variabel untuk nilai yang tidak Anda harapkan bukanlah ide yang baik secara umum. Karena ujian sebagai Anda, Anda dapat mempertimbangkan sebagai menulis daftar hitam dari nilai-nilai terlarang. Tetapi bagaimana jika Anda lupa membuat daftar semua nilai terlarang? Seseorang, bahkan Anda, dapat memecahkan kode Anda dengan memberikan nilai yang tidak terduga. Jadi pendekatan yang lebih tepat adalah sesuatu seperti daftar putih - menguji variabel hanya untuk nilai yang diharapkan, bukan yang tidak terduga. Misalnya, jika Anda mengharapkan nilai data menjadi string, alih-alih ini:
lakukan sesuatu seperti ini:
sumber
typeof foo === "undefined"
berbeda darifoo === undefined
, tidak pernah membingungkan mereka.typeof foo === "undefined"
adalah apa yang benar-benar Anda butuhkan. Juga, gunakan!==
di tempat!=
Jadi pernyataan itu bisa ditulis sebagai
Edit:
Anda tidak dapat menggunakan
foo === undefined
untuk variabel yang tidak dideklarasikan.sumber
foo === undefined
berbahaya untuk digunakan. Itu membuat kode Anda gagal untuk kondisi yang sama dengan yang Anda coba cegah.foo === undefined
sangat dapat diterima dalam situasi OP (dengan asumsiundefined
belum diganti). Jawabannya juga gagal menjelaskan mengapa!==
harus digunakan sebagai pengganti!=
.Cara sederhana untuk melakukan tes Anda adalah:
sumber
data
string, tes ini mengembalikan false pada string kosong, yang mungkin, atau mungkin tidak, sesuai (fungsi mungkin ingin berurusan dengan string kosong dalam beberapa cara).""
atau0
atauNaN
(atau yang lain) blok "jika" akan dilewati; yang mungkin atau tidak mungkin niat OP.sumber
null
.