Saya sering melihat kode JavaScript yang memeriksa parameter yang tidak ditentukan, dll. Dengan cara ini:
if (typeof input !== "undefined") {
// do stuff
}
Ini sepertinya agak boros, karena melibatkan pencarian tipe dan perbandingan string, belum lagi verbositasnya. Itu diperlukan karenaundefined
bisa diubah namanya.
Pertanyaan saya adalah:
Bagaimana kode itu lebih baik daripada pendekatan ini:
if (null != input) {
// do stuff
}
Sejauh yang saya tahu, Anda tidak dapat mendefinisikan ulang null
, jadi itu tidak akan rusak secara tak terduga. Dan, karena jenis-paksaan dari !=
operator, ini memeriksa keduanya undefined
dan null
... yang sering kali persis seperti yang Anda inginkan (misalnya untuk parameter fungsi opsional).
Namun formulir ini tampaknya tidak tersebar luas, dan bahkan menyebabkan JSLint berteriak kepada Anda karena menggunakan !=
operator jahat .
Mengapa ini dianggap gaya yang buruk?
sumber
if (null != input)
hanya "Yoda Speak" untuk penutur bahasa Inggris (Dari satu aku .... uuammmmm) jadi jika mereka menyamakan hal yang sama itu benar-benar hanya semantik. MENURUT OPINI SAYA.Jawaban:
typeof
lebih aman karena memungkinkan pengidentifikasi tidak pernah dideklarasikan sebelumnya:sumber
==
bisa lebih baik, karena ia menguji null dan tidak terdefinisi.!==
atau===
operator ketika membandingkan nilai yang jenisnya dikenal sebagai string.Jika variabel dinyatakan (baik dengan
var
kata kunci, sebagai argumen fungsi, atau sebagai variabel global), saya pikir cara terbaik untuk melakukannya adalah:jQuery melakukannya, jadi itu cukup baik untuk saya :-)
Jika tidak, Anda harus menggunakan
typeof
untuk menghindari aReferenceError
.Jika Anda berharap tidak terdefinisi ulang, Anda dapat membungkus kode Anda seperti ini:
Atau dapatkan melalui
void
operator:sumber
undefined
adalah nama yang diberikan ke parameter fungsi, bukan nilainya. Tidak ada yang diteruskan ke fungsi, artinya nilai parameter pertama tidak terdefinisi.Cara yang baik:
Tetapi cara terbaik adalah memeriksa melalui:
sumber
if (typeof neverDeclared === typeof undefined) {
tetapi Lint melempar kesalahan. "Diharapkan sebuah string dan bukannya melihat 'typeof'." Bagaimana Anda mengatasi kesalahan ini? Haruskah kita tunduk pada permintaan Lint dan menggunakan 'cara yang baik' sebagai gantinya?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
tetapi itu agak panjang.Anda tidak perlu khawatir tentang penggantian nama yang tidak ditentukan. Jika seseorang mengganti nama tidak terdefinisi, Anda akan berada dalam banyak masalah daripada hanya beberapa jika pemeriksaan gagal. Jika Anda benar-benar ingin melindungi kode Anda, bungkus dengan IFFE (ekspresi fungsi yang langsung dipanggil) seperti ini:
Jika Anda bekerja dengan variabel global (yang sudah salah) di lingkungan browser, saya akan memeriksa yang tidak terdefinisi seperti ini:
Karena variabel global adalah bagian dari objek jendela, Anda bisa mengecek terhadap undefined alih-alih casting ke string dan membandingkan string.
Selain itu, mengapa variabel Anda tidak didefinisikan? Saya telah melihat banyak kode di mana mereka memeriksa keberadaan variabel dan melakukan beberapa tindakan berdasarkan itu. Tidak sekali pun saya melihat di mana pendekatan ini benar.
sumber
Jika Anda benar-benar khawatir tentang definisi ulang yang tidak didefinisikan, Anda dapat melindungi hal ini dengan beberapa metode pembantu seperti ini:
Ini berfungsi karena ketika seseorang menulis,
undefined = "foo"
dia hanya mengizinkan referensi namaundefined
ke nilai baru, tetapi dia tidak mengubah nilai sebenarnyaundefined
.sumber
undefined_check
di bagian atas dan kemudian menggunakannya di mana-mana dalam kode Anda.typeof
pemeriksaan.Anda juga dapat menggunakan operator void untuk mendapatkan nilai yang tidak ditentukan:
(Dan ya, seperti disebutkan dalam jawaban lain, ini akan menimbulkan kesalahan jika variabel tidak dideklarasikan, tetapi kasus ini sering dapat dikesampingkan dengan inspeksi kode, atau dengan kode refactoring, misalnya menggunakan
window.input !== void 0
untuk menguji variabel global atau menambahkanvar input
.)sumber
Saya sebenarnya menemukan jika
(typeof input !== 'undefined')
dalam skenario ini digunakan untuk menyediakan parameter fungsi default:ES6 menyediakan cara baru untuk memperkenalkan parameter fungsi default dengan cara ini:
Ini kurang verbose dan lebih bersih daripada opsi pertama.
sumber
sumber
sumber
sumber
berfungsi dengan baik. Ini tentu saja bukan
null
perbandingan, tetapi saya biasanya menemukan bahwa jika saya perlu membedakan antaraundefined
dannull
, saya sebenarnya lebih perlu untuk membedakan antaraundefined
dan sembarang nilai salah, jadimelakukannya.
Jika sebuah program meredefinisi,
undefined
itu benar-benar braindead.Satu-satunya alasan saya bisa memikirkan adalah untuk kompatibilitas IE4, itu tidak memahami
undefined
kata kunci (yang tidak benar-benar kata kunci, sayangnya), tapi tentu saja nilai-nilai bisa menjadiundefined
, sehingga Anda harus memiliki ini:dan perbandingan di atas akan bekerja dengan baik.
Dalam contoh kedua Anda, Anda mungkin membutuhkan tanda kurung ganda untuk membuat serat bahagia?
sumber
input == undefined
akan kembalitrue
padanull
input.