Metode pengecekan apakah variabel yang telah diinisialisasi lebih baik / benar? (Dengan asumsi variabel dapat menampung apa saja (string, int, objek, fungsi, dll.))
if (elem) { // or !elem
atau
if (typeof(elem) !== 'undefined') {
atau
if (elem != null) {
javascript
variables
initialization
undefined
Samuel Liew
sumber
sumber
foo
dideklarasikan,typeof foo === 'undefined'
atautypeof foo === typeof undefined
undefined
. Jawaban yang benar adalah ini: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
tidak memiliki kekurangan yang sama seperti yang lain, tetapi akan memerlukan beberapa penyesuaian untuk Node (gantiwindow
denganglobal
).Jawaban:
Anda ingin yang
typeof
Operator . Secara khusus:sumber
The
typeof
Operator akan memeriksa apakah variabel tersebut benar-benar tidak terdefinisi.The
typeof
operator, tidak seperti operator lain, tidak melempar ReferenceError pengecualian ketika digunakan dengan variabel dideklarasikan.Namun, harap diperhatikan bahwa
typeof null
akan kembali"object"
. Kita harus berhati-hati untuk menghindari kesalahan menginisialisasi variabelnull
. Agar aman, ini yang bisa kita gunakan:Untuk info lebih lanjut tentang menggunakan perbandingan ketat,
===
bukan kesetaraan sederhana==
, lihat: Operatormana yang sama dengan (== vs ===) yang harus digunakan dalam perbandingan JavaScript?
sumber
if(! variable_here)
akan pecah dalam banyak kasus. Jika variabelnya 0 atau salah, itu akan gagal. Bukan itu yang Anda inginkan.typeof foo === "undefined"
itu benar, dan lebih baik daripada jawaban pilihan teratas, tetapi catatan tambahan hanya membuat jawaban ini membingungkan.Dalam banyak kasus, menggunakan:
akan melakukan pekerjaan untuk Anda! ... ini akan memeriksa kasus-kasus di bawah ini:
undefined
''
Jadi itu akan mencakup semua jenis kasus, tetapi selalu ada kasus aneh yang ingin kami bahas juga, misalnya, string dengan spasi, seperti ini
' '
, ini akan didefinisikan dalam javascript karena memiliki spasi di dalam string ... misalnya dalam hal ini Anda menambahkan satu lagi cek menggunakan trim (), seperti:Juga, pemeriksaan ini hanya untuk nilai , karena objek dan array bekerja secara berbeda dalam Javascript, array
[]
kosong dan objek kosong{}
selalu benar .Saya membuat gambar di bawah ini untuk menunjukkan jawaban singkatnya:
sumber
if(elem)
memeriksa tidak terdefinisi (sementara itu mengembalikan kesalahan tidak didefinisikan), bukan?Dalam JavaScript, sebuah variabel dapat didefinisikan, tetapi memiliki nilainya
undefined
, sehingga jawaban yang paling umum tidak benar secara teknis, dan sebaliknya melakukan yang berikut:Itu mungkin cukup untuk tujuan Anda. Tes berikut memiliki semantik yang lebih sederhana, yang membuatnya lebih mudah untuk menggambarkan perilaku kode Anda secara tepat dan memahaminya sendiri (jika Anda peduli tentang hal-hal seperti itu):
Ini, tentu saja, mengasumsikan Anda berjalan di browser (di mana
window
adalah nama untuk objek global). Tetapi jika Anda bercanda dengan global seperti ini, Anda mungkin berada di browser. Secara subyektif, penggunaan'name' in window
konsisten dengan gaya menggunakanwindow.name
untuk merujuk ke global. Mengakses global sebagai properti dariwindow
bukan sebagai variabel memungkinkan Anda untuk meminimalkan jumlah variabel yang tidak dideklarasikan yang Anda referensi dalam kode Anda (untuk kepentingan linting), dan menghindari kemungkinan global Anda dibayangi oleh variabel lokal. Juga, jika global membuat kulit Anda merangkak, Anda mungkin merasa lebih nyaman menyentuhnya hanya dengan tongkat yang relatif panjang ini.sumber
Dalam sebagian besar kasus, Anda akan menggunakan:
Tidak seperti sederhana
if (elem)
, memungkinkan0
,false
,NaN
dan''
, tetapi menolaknull
atauundefined
, membuatnya menjadi baik, tes umum untuk kehadiran argumen, atau properti dari objek.Pemeriksaan lainnya juga tidak salah, mereka hanya memiliki kegunaan yang berbeda:
if (elem)
: Dapat digunakan jikaelem
dijamin menjadi objek, atau jikafalse
,0
, dll dianggap "default" nilai-nilai (maka setara denganundefined
ataunull
).typeof elem == 'undefined'
dapat digunakan dalam kasus di mana yang ditentukannull
memiliki arti berbeda dengan variabel atau properti yang tidak diinisialisasi.elem
tidak dideklarasikan (yaitu tidak adavar
pernyataan, bukan propertiwindow
, atau bukan argumen fungsi). Ini, menurut saya, agak berbahaya karena memungkinkan kesalahan pengetikan lewat tanpa diketahui. Untuk menghindari ini, lihat metode di bawah ini.Juga bermanfaat adalah perbandingan ketat terhadap
undefined
:Namun, karena global
undefined
dapat ditimpa dengan nilai lain, yang terbaik adalah mendeklarasikan variabelundefined
dalam cakupan saat ini sebelum menggunakannya:Atau:
Keuntungan sekunder dari metode ini adalah bahwa JS minifiers dapat mengurangi
undefined
variabel menjadi satu karakter, menghemat beberapa byte setiap kali.sumber
undefined
. Saya bahkan tidak berpikir itu layak disebutkan dalam jawabannya. Mungkin satu-satunya nama variabel terburuk yang dapat diterima di semua Javascript.window.
sebelum variabel jika digunakan dalam konteks global ... ini bukan cara terbaik.void(0)
bukanundefined
.false
,0
, dll sebagai nilai-nilai yang tidak valid.Periksa apakah
window
.hasOwnProperty
( "varname
" )Alternatif untuk kebanyakan
typeof
jawaban;Variabel global dideklarasikan dengan
var varname = value;
pernyataan dalam lingkup globalKarena itu,
hasOwnProperty()
metode, yanga
var
dari "varname" telah dinyatakan secara global yaitu merupakan properti dariwindow
.Apa yang hebat tentang
hasOwnProperty()
ini adalah bahwa dalam memanggilnya, kita tidak menggunakan variabel yang mungkin belum dideklarasikan - yang tentu saja merupakan setengah dari masalah.Meskipun tidak selalu yang sempurna atau yang ideal , dalam keadaan tertentu, itu hanya pekerjaan!
Catatan
Di atas benar ketika menggunakan
var
untuk mendefinisikan variabel , yang bertentangan denganlet
yang:Untuk kelengkapan:
const
konstanta, menurut definisi, sebenarnya bukan variabel (walaupun isinya bisa); lebih relevan:Karena
let
variabel atauconst
konstanta tidak pernah merupakan properti dari objek apa pun yang mewarisihasOwnProperty()
metode ini, maka variabel tersebut tidak dapat digunakan untuk memeriksa keberadaannya.Mengenai ketersediaan dan penggunaan
hasOwnProperty()
:sumber
true
(mis.window.hasOwnProperty('console')
Atauvar hop = "p";window.hasOwnProperty('hop')
).typeof
jawabannya abaikan.let
mana variabel ini tidak tersedia sebagai properti dari objekwindow
[atau yang tersedia lainnya].hasOwnProperty
tes untuk keberadaan properti , bukan variabel dan dengan demikian tidak dapat digunakan untuk mendeteksi variabel yang ditentukan olehlet
.var
dan dalam hal itu tidak ketinggalan zaman. Namun saya telah menambahkan catatan yang menguraikan bagaimana penggunaanlet
danconst
berbeda darivar
. Terima kasih atas inspirasi Anda; bersama-sama kita bangkit :)hasOwnProperty
hanya dapat digunakan dengan cara yang ditentukan untuk memeriksa keberadaanvar
variabel. Bunyinya oke untuk saya.Cara memeriksa apakah ada variabel
Ini adalah solusi yang cukup anti peluru untuk pengujian jika ada variabel dan telah diinisialisasi:
Ini paling sering digunakan dalam kombinasi dengan operator ternary untuk menetapkan default jika variabel tertentu belum diinisialisasi:
Masalah dengan enkapsulasi
Sayangnya, Anda tidak bisa hanya merangkum cek Anda dalam suatu fungsi.
Anda mungkin berpikir untuk melakukan sesuatu seperti ini:
Namun, ini akan menghasilkan kesalahan referensi jika Anda menelepon mis.
isset(foo)
dan variabelfoo
belum didefinisikan, karena Anda tidak bisa meneruskan variabel yang tidak ada ke fungsi:Menguji apakah parameter fungsi tidak terdefinisi
Sementara
isset
fungsi kami tidak dapat digunakan untuk menguji apakah suatu variabel ada atau tidak (karena alasan yang dijelaskan di atas), itu memungkinkan kami untuk menguji apakah parameter fungsi tidak terdefinisi:Meskipun tidak ada nilai untuk
y
diteruskan ke fungsitest
,isset
fungsi kami berfungsi dengan baik dalam konteks ini, karenay
dikenal dalam fungsitest
sebagaiundefined
nilai.sumber
Ada cara pintas lain untuk memeriksa ini, ketika Anda melakukan tugas sederhana dan cek terkait. Cukup gunakan Operator Bersyarat (Ternary).
Ini juga akan sangat membantu, ketika Anda mencoba untuk mendeklarasikan variabel Global dengan penetapan instan variabel referensi.
Jika Anda ingin memeriksa variabel tidak boleh
undefined
ataunull
. Kemudian lakukan pemeriksaan di bawah ini.Ketika variabel dideklarasikan, dan jika Anda ingin memeriksa nilainya, ini bahkan sederhana: dan itu akan melakukan
undefined
dannull
memeriksa bersama.sumber
typeof(booooo)
ini"undefined"
makatypeof(typeof boooooo)
adalah"string"
dantypeof boooooo && true
selalutrue
. @ John-Slegers menjawab tentang disingkat yang Anda bisa dapatkan dengan typeof.If you wanted to check variable shouldn't be undefined or null.
, Dengan komentar ini, itu jelas menyatakan, itu tidak melakukan pemeriksaan deklarasi variabel. itu untuk memeriksa nilai variabel.Cara singkat untuk menguji suatu variabel tidak dinyatakan (tidak terdefinisi) adalah
Saya merasa berguna untuk mendeteksi skrip yang berjalan di luar browser (tidak memiliki
window
variabel yang dideklarasikan ).sumber
window.bar=undefined
didefinisikan dan diatur ke nilai. Jawaban Anda gagal mendeteksi perbedaan antara ini dan jika variabel tidak ada. Jika Anda melakukannyathis.hasOwnProperty('bar')
mungkin berhasil.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. Variabelx
didefinisikan tetapi false dikembalikan ...Itu tergantung jika Anda hanya peduli bahwa variabel telah didefinisikan atau jika Anda ingin memiliki nilai yang bermakna.
Memeriksa apakah tipe tidak terdefinisi akan memeriksa apakah variabel telah ditentukan.
=== null
atau!== null
hanya akan memeriksa apakah nilai variabel tepatnull
.== null
atau!= null
akan memeriksa apakah nilainyaundefined
ataunull
.if(value)
akan memeriksa apakah variabel adalahundefined
,null
,0
, atau string kosong.sumber
Jawaban tertinggi benar, gunakan typeof.
Namun, apa yang ingin saya tunjukkan adalah bahwa dalam JavaScript
undefined
bisa berubah (untuk beberapa alasan fasik). Jadi, sekadar melakukan pemeriksaanvarName !== undefined
memiliki potensi untuk tidak selalu kembali seperti yang Anda harapkan, karena lib lain bisa berubah tidak terdefinisi. Beberapa jawaban (@ skalee, misalnya), tampaknya lebih suka tidak menggunakantypeof
, dan itu bisa membuat masalah.Cara "lama" untuk menangani hal ini adalah menyatakan tidak ditentukan sebagai var untuk mengimbangi potensi mutasi / over-riding
undefined
. Namun, cara terbaik masih digunakantypeof
karena akan mengabaikan pengesampingan dariundefined
kode lain. Terutama jika Anda menulis kode untuk digunakan di alam liar di mana siapa tahu apa lagi yang bisa berjalan di halaman ...sumber
varName !== undefined
hanya akan menyebabkan ReferenceError. Mutabilitas dariundefined
tidak penting.undefined
adalah properti hanya baca. Namun agar antipeluru bisa Anda gunakantypeof mvVar === typeof void 0
.void 0
kembaliundefined
selalu.Atau lebih baik
Bekerja di semua browser
sumber
Untuk berkontribusi dalam debat, jika saya tahu variabelnya harus berupa string atau objek yang selalu saya sukai
if (!variable)
, jadi periksa apakah itu salah. Ini dapat membawa ke kode yang lebih bersih sehingga, misalnya:..dapat dikurangi menjadi:
sumber
''
solusi Anda akan menganggapnya tidak terdefinisi, padahal sebenarnya didefinisikan sebagai berisi string kosong.Sulit untuk membedakan antara undefined dan null. Null adalah nilai yang dapat Anda tetapkan ke variabel saat Anda ingin menunjukkan bahwa variabel tidak memiliki nilai tertentu. Undefined adalah nilai khusus yang akan menjadi nilai default dari variabel yang tidak ditetapkan.
sumber
Null adalah nilai dalam JavaScript dan
typeof null
kembali"object"
Karenanya, jawaban yang diterima tidak akan berfungsi jika Anda memberikan nilai nol. Jika Anda lulus nilai nol, Anda perlu menambahkan pemeriksaan tambahan untuk nilai nol:
sumber
Pemeriksaan 'is it defined' yang paling kuat adalah dengan typeof
Jika Anda hanya memeriksa variabel yang ditentukan untuk menetapkan default, untuk satu liner yang mudah dibaca Anda sering dapat melakukan ini:
Ini sering baik untuk digunakan, lihat: Cara idiomatis untuk menetapkan nilai default dalam javascript
Ada juga yang satu ini menggunakan kata kunci typeof :
sumber
Anda dapat menggunakan
typeof
operator.Sebagai contoh,
Cuplikan kode di atas akan menghasilkan output seperti
sumber
Untuk memeriksa apakah suatu variabel telah dinyatakan / diset, saya melakukan trik kotor ini.
Saya belum menemukan cara untuk mengekstrak kode ke suatu fungsi, bahkan dengan
eval
.sumber
Jawaban-jawaban ini (selain dari solusi Fred Gandt) semuanya salah atau tidak lengkap.
Misalkan saya perlu saya
variableName;
membawaundefined
nilai, dan karena itu telah dinyatakan dengan cara sepertivar variableName;
yang berarti sudah diinisialisasi ; - Bagaimana saya memeriksa apakah sudah dinyatakan?Atau bahkan lebih baik - bagaimana saya segera memeriksa apakah "Book1.chapter22.paragraph37" ada dengan satu panggilan, tetapi tidak menimbulkan kesalahan referensi?
Kami melakukannya dengan menggunakan operator JasvaScript paling kuat, operator in . :
Pada masa popularitas AJAX memuncak saya telah menulis sebuah metode (kemudian dinamai) isNS () yang mampu menentukan apakah namespace ada termasuk tes mendalam untuk nama properti seperti "Book1.chapter22.paragraph37" dan banyak lagi.
Tetapi karena sudah diterbitkan sebelumnya dan karena sangat penting untuk diterbitkan dalam utas terpisah, saya tidak akan mempostingnya di sini tetapi akan memberikan kata kunci ( javascript + isNS ) yang akan membantu Anda menemukan kode sumber, didukung dengan semua penjelasan yang diperlukan.
sumber
in
Operator hanya menguji keberadaan properti, dan tidak semua variabel adalah properti -const
danlet
deklarasi tidak (danconst
bahkan tidak, baik, variabel ).const
danlet
telah distandarisasi dengan ECMAScript 2015, yang diterbitkan lebih dari 3 tahun yang lalu dan sejak itu telah melihat adopsi yang baik oleh para tersangka biasa dan digunakan agak meresap hari ini, berani saya katakan - ada lebih dari 2 juta kemunculan "const" di Github dalam file JS .in
operator untuk secara umum menguji apakah suatu variabel ada, karena "const dan let bukan [properti]" - sementaraconst
memang dapat dikatakan memperkenalkan referensi konstan , seperti bertentangan dengan referensi variabellet
,, di sisi lain, benar-benar memperkenalkan referensi variabel - itu, dengan kata lain, dengan ukuran apa pun, variabel dan jawaban Anda salah dalam menyiratkan bahwa Anda dapat menguji apakah variabel yang didefinisikan denganlet
ada dengan menggunakanin
operator - Anda tidak bisa.window
objek, saya tidak tahu bagaimana membuatnya lebih jelas bagi Anda.let
kata kunci. Hanya itu yang saya tunjukkan.Dalam situasi khusus yang dijabarkan dalam pertanyaan,
identik dengan
Saya lebih suka yang terakhir karena lebih pendek.
Harap perhatikan bahwa kami
console
hanya mencari dalam lingkup global (yang merupakanwindow
objek di semua browser). Dalam situasi khusus ini diinginkan. Kami tidak mauconsole
didefinisikan di tempat lain.@BrianKelley dalam jawabannya yang luar biasa menjelaskan perincian teknis. Saya hanya menambahkan kesimpulan yang kurang dan mencernanya menjadi sesuatu yang lebih mudah dibaca.
sumber
Saya menggunakan dua cara berbeda tergantung pada objek.
Terkadang saya tidak ingin mengevaluasi string kosong sebagai falsey, jadi saya menggunakan case ini
Jika Anda membutuhkan kebalikannya, maka dalam instance pertama! Variabel menjadi !! variabel, dan dalam fungsi yang tidak valid === menjadi! = Dan nama fungsi berubah menjadi notInvalid.
sumber
Preferensi saya adalah
typeof(elem) != 'undefined' && elem != null
.Bagaimanapun Anda memilih, pertimbangkan untuk meletakkan cek dalam fungsi seperti itu
Jika Anda tidak tahu variabelnya dinyatakan, lanjutkan dengan
typeof (x) != 'undefined' && x != null;
Di mana Anda tahu variabelnya dideklarasikan tetapi mungkin tidak ada, Anda bisa menggunakan
Variabel yang Anda periksa mungkin properti bersarang kadang-kadang. Anda dapat menggunakan prop || {} untuk pergi ke garis memeriksa keberadaan ke properti yang bersangkutan:
Setelah setiap penggunaan properti (... '|| {}') .Top berikutnya agar properti yang hilang tidak akan menimbulkan kesalahan.
Atau Anda bisa menggunakan yang ada seperti
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
sumber
typeof (x) != 'undefined' && x != null
setara denganx != null
saatx
dideklarasikan.Itu tergantung situasi. Jika Anda memeriksa sesuatu yang mungkin atau mungkin belum didefinisikan secara global di luar kode Anda (seperti jQuery mungkin), Anda ingin:
(Tidak perlu untuk kesetaraan yang ketat di sana, typeof selalu mengembalikan string.) Tetapi jika Anda memiliki argumen untuk fungsi yang mungkin atau mungkin tidak telah lulus, mereka akan selalu didefinisikan, tetapi nol jika dihilangkan.
sumber
Coba tangkap
Jika variabel tidak didefinisikan sama sekali, Anda dapat memeriksa ini tanpa eksekusi kode istirahat menggunakan blok try-catch sebagai berikut (Anda tidak perlu
use strict
mode)Tampilkan cuplikan kode
BONUS: (merujuk pada jawaban lain) Mengapa
===
lebih jelas daripada==
( sumber )jika (a == b)
jika (a === b)
sumber
Saya terkejut ini belum disebutkan ...
berikut adalah beberapa variasi tambahan yang digunakan
this['var_name']
manfaat menggunakan metode ini yang dapat digunakan sebelum variabel didefinisikan.
sumber
window.bar=undefined
didefinisikan dan diatur ke nilai. Jawaban Anda gagal mendeteksi perbedaan antara ini dan jika variabel tidak ada. Jika Anda melakukannyathis.hasOwnProperty('bar')
mungkin berhasil.Anda dapat menggunakan try ... catch block seperti berikut:
Tampilkan cuplikan kode
Kerugiannya adalah Anda tidak bisa memasukkannya ke dalam fungsi karena akan membuang ReferenceError
sumber