The jQuery Inti Style Pedoman menyarankan dua cara yang berbeda untuk memeriksa apakah suatu variabel didefinisikan.
- Variabel Global:
typeof variable === "undefined"
- Variabel Lokal:
variable === undefined
- Properti:
object.prop === undefined
Mengapa jQuery menggunakan satu pendekatan untuk variabel global dan lainnya untuk penduduk lokal dan properti?
javascript
jquery
undefined
Patrick McElhaney
sumber
sumber
foo === undefined
sedang memeriksa salinan lokal undefined bukan global (window.undefined), yang mungkin telah dimodifikasi oleh kode gila. Fakta bahwa undefined bisa berubah jelas layak dicatat dan saya senang Anda melakukannya. (+1)Jawaban:
Untuk variabel yang tidak dideklarasikan,
typeof foo
akan mengembalikan string literal"undefined"
, sedangkan pemeriksaan identitasfoo === undefined
akan memicu kesalahan "foo tidak didefinisikan" .Untuk variabel lokal (yang Anda ketahui dideklarasikan di suatu tempat), tidak ada kesalahan seperti itu akan terjadi, karenanya pemeriksaan identitas.
sumber
typeof foo; // -> "undefined"
) untuk menekankan itu adalah string dan bukan nilai primitifundefined
.Saya akan tetap menggunakan di
typeof foo === "undefined"
mana - mana. Itu tidak akan pernah salah.Saya membayangkan alasan mengapa jQuery merekomendasikan dua metode yang berbeda adalah bahwa mereka mendefinisikan
undefined
variabel mereka sendiri di dalam fungsi tempat kode jQuery tinggal, jadi di dalam fungsiundefined
itu aman dari gangguan dari luar. Saya juga akan membayangkan bahwa seseorang di suatu tempat telah membandingkan dua pendekatan yang berbeda dan menemukan bahwafoo === undefined
itu lebih cepat dan karena itu memutuskan itulah cara untuk pergi. [PEMBARUAN: seperti disebutkan dalam komentar, perbandingan denganundefined
juga sedikit lebih pendek, yang bisa menjadi pertimbangan.] Namun, keuntungan dalam situasi praktis akan sama sekali tidak signifikan: pemeriksaan ini tidak akan pernah menjadi hambatan, dan apa Anda kalah adalah signifikan: mengevaluasi properti objek host untuk perbandingan dapat menimbulkan kesalahan sedangkan atypeof
periksa tidak akan pernah.Misalnya, berikut ini digunakan di IE untuk parsing XML:
Untuk memeriksa apakah ada
loadXML
metode yang aman:Di samping itu:
MEMPERBARUI
Keuntungan lain dari
typeof
cek yang saya lupa sebutkan adalah bahwa ia juga bekerja dengan variabel yang tidak dideklarasikan, yangfoo === undefined
tidak dicentang, dan sebenarnya melempar aReferenceError
. Terima kasih kepada @LinusKleen untuk mengingatkan saya. Sebagai contoh:Intinya: selalu gunakan
typeof
cek.sumber
foo === undefined
, ketika diminimalkan, mungkin sesuatu sepertif===u
, sedangkantypeof foo === "undefined"
hanya dapat dikurangi menjaditypeof f==="undefined"
.var u = "undefined"
dan menguranginya menjaditypeof f==u
, yang meningkatkan hal-hal tetapi masih lebih besar.typeof
terhadap variabel yang tidak dideklarasikan adalah keuntungan. Jika ada yang memungkinkan kesalahan pengetikan melewati lebih mudah, dan saya tidak bisa melihat kapan Anda sebenarnya ingin memeriksa jenis variabel yang tidak dideklarasikan.Namun alasan lain untuk menggunakan varian typeof:
undefined
dapat didefinisikan ulang.Hasil dari
typeof variable
tidak bisa.Pembaruan : perhatikan bahwa ini bukan kasus di ES5 di mana global
undefined
adalah properti yang tidak dapat dikonfigurasi, tidak dapat ditulis:Tapi itu masih bisa dibayangi oleh variabel lokal:
atau parameter:
sumber
undefined
Properti global tidak dapat didefinisikan ulang dalam ES5, tetapi masih dapat dibayangi dengan variabel lokal.void 0
lebih pendek dan lebih aman.Karena
undefined
tidak selalu dideklarasikan, tetapi jQuery menyatakanundefined
dalam fungsi utamanya. Jadi mereka menggunakan nilai aman secaraundefined
internal, tetapi di luar, mereka menggunakantypeof
gaya untuk menjadi aman.sumber
Siapa yang tertarik dengan peningkatan kinerja
variable === undefined
, dapat melihat di sini, tetapi tampaknya hanya pengoptimalan krom.sumber
Untuk variabel lokal, pemeriksaan dengan
localVar === undefined
akan berfungsi karena mereka harus didefinisikan di suatu tempat dalam lingkup lokal atau mereka tidak akan dianggap lokal.Untuk variabel yang tidak lokal dan tidak didefinisikan di mana saja, pemeriksaan
someVar === undefined
akan membuang pengecualian: Uncaught ReferenceError: j tidak didefinisikanBerikut adalah beberapa kode yang akan menjelaskan apa yang saya katakan di atas. Harap perhatikan komentar sebaris untuk kejelasan lebih lanjut .
Jika kita memanggil kode di atas seperti ini:
Outputnya akan seperti ini:
Jika kita memanggil kode di atas seperti ini (dengan nilai sebenarnya):
Outputnya adalah:
Ketika Anda melakukan pemeriksaan seperti ini:,
typeof x === 'undefined'
Anda pada dasarnya menanyakan ini: Harap periksa apakah variabelx
ada (telah ditentukan) di suatu tempat dalam kode sumber. (lebih atau kurang). Jika Anda tahu C # atau Java, jenis pemeriksaan ini tidak pernah dilakukan karena jika tidak ada, itu tidak akan dikompilasi.<== Fiddle Me ==>
sumber
Ringkasan:
Ketika di lingkup global kita sebenarnya ingin mengembalikan true jika variabel tidak dideklarasikan atau memiliki nilai
undefined
:Karena dalam lingkup global kami tidak 100% yakin jika suatu variabel dideklarasikan, ini mungkin memberi kami ReferenceError. Ketika kami menggunakan
typeof
operator pada variabel yang tidak dikenal, kami tidak mendapatkan masalah ini ketika variabel tidak dideklarasikan:Ini disebabkan oleh fakta bahwa
typeof
operator mengembalikan stringundefined
ketika suatu variabel tidak dideklarasikan atau saat ini memegang nilaiundefined
yang persis seperti yang kita inginkan.undefined
sumber
typeof a === 'undefined'
lebih cepat makaa === 'undefined'
sekitar 2 kali pada node v6.9.1.sumber
undefined
pada bagian kedua, bukan'undefined'