Bagaimana cara memeriksa variabel yang tidak terdefinisi atau nol dalam JavaScript?

500

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_variabletidak 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?

Tomas Vana
sumber
46
if(some_variable) { ... }tidak akan mengeksekusi jika some_variableini falseatau 0atau ...
KennyTM
poin bagus;) Tapi katakanlah saya tahu itu tidak mungkin salah atau 0 dan saya hanya ingin memeriksa apakah saya dapat menggunakannya dalam beberapa logika (sebagai string, array, dll.)
Tomas Vana
Terkait: stackoverflow.com/questions/27509/…
Jørn Schou-Rode
2
... atau string kosong.
David Diberikan

Jawaban:

333

Anda harus membedakan antara kasus:

  1. Variabel dapat undefinedatau tidak dideklarasikan . Anda akan mendapatkan kesalahan jika Anda mengakses variabel yang tidak dideklarasikan dalam konteks apa pun selain typeof.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

Variabel yang telah dideklarasikan tetapi tidak diinisialisasi adalah undefined.

let foo;
if (foo) //evaluates to false because foo === undefined
  1. Properti tidak terdefinisi , seperti someExistingObj.someUndefProperty. Properti tidak terdefinisi tidak menghasilkan kesalahan dan hanya mengembalikan undefined, yang, ketika dikonversi menjadi boolean, dievaluasi menjadi false. Jadi, jika Anda tidak peduli 0dan false, menggunakan if(obj.undefProp)tidak apa-apa. Ada idiom umum berdasarkan fakta ini:

    value = obj.prop || defaultValue

    yang berarti "jika objmemiliki properti prop, tetapkan ke value, atau tetapkan nilai defaultdefautValue ".

    Beberapa orang menganggap perilaku ini membingungkan, dengan alasan bahwa ini mengarah pada kesalahan yang sulit ditemukan dan merekomendasikan untuk menggunakan inoperator sebagai gantinya

    value = ('prop' in obj) ? obj.prop : defaultValue
pengguna187291
sumber
1
Maka Anda bisa berbicara tentang hasOwnProperty dan prototipe. 'indexOf' di []! == [] .hasOwnProperty ('indexOf')
Alsciende
1
Ya, saya berpikir untuk menambahkan ini, tetapi memutuskan untuk mengorbankan kelengkapan untuk singkatnya. ;)
user187291
52
Anda tidak mengatasi masalah 0 dan false
TMS
12
Maksud Anda variabel yang tidak dideklarasikan . Variabel dapat dideklarasikan tetapi masih memiliki nilai undefined.
Tgr
1
Dan juga perhatikan bahwa typeofmengembalikan string. Jadi var myVar; typeof(myVar)==undefinedpengembalian falsetidak true.
rism
417

Saya pikir cara paling efisien untuk menguji "nilai adalah nullatau undefined" adalah

if ( some_variable == null ){
  // some_variable is either null or undefined
}

Jadi dua baris ini setara:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

Catatan 1

Seperti disebutkan dalam pertanyaan, varian pendek mengharuskan yang some_variabletelah dinyatakan, jika tidak ReferenceError akan dibuang. Namun dalam banyak kasus penggunaan Anda dapat menganggap bahwa ini aman:

periksa argumen opsional:

function(foo){
    if( foo == null ) {...}

periksa properti pada objek yang ada

if(my_obj.foo == null) {...}

Di sisi lain typeofdapat menangani variabel global yang tidak dideklarasikan (hanya mengembalikan undefined). Namun kasus-kasus ini harus dikurangi seminimal mungkin untuk alasan yang baik, seperti dijelaskan Alsciende.

Catatan 2

Varian ini - bahkan lebih pendek - tidak setara:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

begitu

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

Catatan 3

Secara umum disarankan untuk menggunakan ===bukan ==. Solusi yang diusulkan adalah pengecualian untuk aturan ini. The JSHint sintaks checker bahkan menyediakan eqnullpilihan untuk alasan ini.

Dari panduan gaya jQuery :

Pemeriksaan kesetaraan yang ketat (===) harus digunakan untuk ==. Satu-satunya pengecualian adalah ketika memeriksa tidak terdefinisi dan null dengan nol.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;
mar10
sumber
1
Perbedaan yang sangat penting (yang sudah disebutkan dalam pertanyaan btw). Itu sebabnya semua orang menggunakan typeof. Maaf tapi saya tidak mendapatkan jawaban yang berguna, Anda cukup mengatakan apa yang dikatakan dalam pertanyaan dan dalam beberapa baris pertama Anda menyatakannya salah.
TMS
33
Maaf, tapi saya harus tidak setuju ;-) Menggunakan == nulladalah 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 seperti if( o.foo == null).
Mar10
1
@ mar10 (aUndefinedVar == null) memberi Anda kesalahan "aUndefinedVar tidak didefinisikan" tidak benar.
Rannnn
7
Terima kasih atas opsi ringkas ini. Dalam 99% kode saya, tidak perlu membedakan antara nol dan tidak terdefinisi, oleh karena itu singkatnya hasil cek ini dalam kode yang kurang berantakan.
Ian Lovejoy
1
Untuk mencegah ReferenceError saat memeriksa variabel global, gunakan window.someProperty == null. Untuk variabel lokal, Anda dapat dengan mudah memastikannya dinyatakan: alih-alih menulis if (...) {var local = ""}tulisvar local; if (...) { local = ""; }
Aloso
66

Memeriksa null dengan persamaan normal juga akan mengembalikan true untuk undefined.

if (window.variable == null) alert('variable is null or undefined');

Kesetaraan JS

Semra
sumber
4
NaN tidak sama dengan Nan?
Sharjeel Ahmed
2
@monotheist NaN tidak sama dengan NaN (lihat halaman NaN MDN ). Javascript menggunakan IEEE-754 untuk floating point mereka yang menentukan perilaku ini. Ada beberapa pemikiran untuk ini, lihat stackoverflow.com/a/23666623/2563765
Steven
1
@ SharjeelAhmed Ini dikoreksi secara matematis. NaNdari persamaan perbedaan tidak pernah bisa diharapkan sama
Thaina
28

Dalam standar JavaScript yang lebih baru seperti ES5 dan ES6 bisa Anda katakan

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

semua return false, yang mirip dengan pemeriksaan Python tentang variabel kosong. Jadi jika Anda ingin menulis logika kondisional di sekitar variabel, katakan saja

if (Boolean(myvar)){
   // Do something
}

di sini "null" atau "string kosong" atau "tidak terdefinisi" akan ditangani secara efisien.

Naren Yellavula
sumber
2
didukung ke suka ie5, mengapa ini tidak lebih terkenal !?
Himmators
12
OP hanya ingin menguji yang berbeda nulldan undefined, nilai-nilai palsu lainnya harus kembali benar!
Andre Figueiredo
1
Itu tidak menambah nilai dalam kondisi. Kondisi mengevaluasi persis sama dan masih mengembalikan false untuk 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.
erich2k8
> FYI ini juga setara dengan nilai !!, yang mana yang pertama! meniadakan kebenaran. Yang FYI juga setara dengan if (var)yang akan dilemparkan ke boolean, jadi pada dasarnya sama sekali tidak berguna ...
Cyril CHAPON
2
Meskipun secara harfiah menggunakan kata kunci tidak terdefinisi , 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"
Stephen P
22

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:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

untuk

if (myObj.some_property != null)

Dengan mengingat hal ini, dan fakta bahwa variabel global dapat diakses sebagai properti dari objek global ( windowdalam hal browser), Anda dapat menggunakan yang berikut untuk variabel global:

if (window.some_variable != null) {
    // Do something with some_variable
}

Dalam lingkup lokal, selalu berguna untuk memastikan variabel dideklarasikan di bagian atas blok kode Anda, ini akan menghemat penggunaan berulang typeof.

Andy E
sumber
11
Anda akan kehilangan NaN, 0, "" dan penyebab salah mereka bukan null atau tidak terdefinisi tetapi juga salah.
Andreas Köberle
@ Andrew Köberle benar. Bahkan operator kesetaraan non-ketat mengatakan bahwa nol berbeda dari NaN, 0, "", dan false. Anda harus lakukan if (myObj.some_property != null)untuk mendapatkan perilaku yang setara.
thejoshwolfe
15

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 menguji nullatau undefinedharus memiliki karakteristik berikut:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

Mari kita lihat ide mana di sini yang benar-benar lulus dari tes kami.

Pekerjaan ini:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

Ini tidak berfungsi:

typeof(val) === 'undefined'
!!val

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 == nulltes sederhana memberikan kinerja terbaik. Ini juga yang terpendek. Tes dapat dinegasikan ke val != nulljika Anda ingin melengkapi.

Drew Noakes
sumber
12

ini adalah satu-satunya kasus yang ==harus digunakan:

if (val == null) console.log('val is null or undefined')
Yukulélé
sumber
3
jawaban ini sekitar tahun 2019 memiliki kelangkaan upvotes tetapi jawaban KISS untuk kasus penggunaan ini. Jugaval != null untuk yang sebaliknya, hanya satu = dan karena per @Yukulele itu HANYA yang digunakan, ==Anda akan tahu apa yang dilakukannya ketika Anda melihatnya.
DKebler
7

Karena tidak ada jawaban yang lengkap dan benar, saya akan mencoba merangkum:

Secara umum, ungkapan:

if (typeof(variable) != "undefined" && variable != null)

tidak dapat disederhanakan, karena variablemungkin tidak dideklarasikan sehingga menghilangkan typeof(variable) != "undefined"akan menghasilkan ReferenceError. Tetapi, Anda dapat menyederhanakan ekspresi sesuai dengan konteksnya :

Jika variableadalah dunia , Anda dapat menyederhanakan ke:

if (window.variable != null)

Jika bersifat lokal , Anda mungkin dapat menghindari situasi ketika variabel ini tidak dideklarasikan, dan juga menyederhanakan untuk:

if (variable != null)

Jika memang properti objek , Anda tidak perlu khawatir tentang ReferenceError:

if (obj.property != null)
TMS
sumber
Apakah navigatorbagian dari window? Saat kami mendapat pengecualian navigator is not defined, bisakah kami menggunakan window.navigator != nulltes ini?
jww
5

Anda bisa memeriksa apakah variabel memiliki nilai atau tidak. Berarti,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

Jika Anda tidak tahu apakah ada variabel (artinya, jika dideklarasikan), Anda harus memeriksa dengan typeof operator. misalnya

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}
DDave
sumber
4

Saya telah melakukan ini dengan menggunakan metode ini

simpan id dalam beberapa variabel

var someVariable = document.getElementById("someId");

kemudian gunakan jika kondisinya

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}
Mab Kiani
sumber
4

Ini adalah contoh acara yang sangat langka di mana dianjurkan untuk digunakan ==sebagai gantinya ===. Ekspresi somevar == nullakan mengembalikan true untuk undefineddan null, 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 operator null, karena ini hampir selalu perilaku yang diinginkan.

Perbandingan paling umum:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

Cobalah sendiri:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);
Sabo
sumber
3

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 (!!)

!!window['bleh'];

Ini akan menghasilkan false sementara bleh belum dinyatakan DAN diberi nilai.

Farax
sumber
3

inilah cara lain menggunakan metode Array mencakup () :

[undefined, null].includes(value)
Jason
sumber
Itu tidak bekerja! ReferenceError: nilai tidak didefinisikan
Sébastien Temprado
1
Ini harus menjadi nilai yang ingin Anda periksa.
a2441918
2

apa pun yyy Anda tidak terdefinisi atau nol, itu akan mengembalikan true

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

Iya

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

tidak

Terry Lin
sumber
2

Buka alat Pengembang di browser Anda dan coba saja kode yang ditunjukkan pada gambar di bawah ini.

Img1 Img2

Akash Preet
sumber
2

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.

masukkan deskripsi gambar di sini

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.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

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.

Kode-EZ
sumber
2

Mirip dengan apa yang Anda miliki, Anda dapat melakukan sesuatu seperti

if (some_variable === undefined || some_variable === null) { do stuff }

gpap
sumber
0

Pengujian nullity ( if (value == null)) atau non-nullity ( if (value != null)) kurang verbose daripada pengujian status definisi variabel.

Selain itu, pengujian if (value)(atau if( obj.property)) untuk memastikan keberadaan variabel Anda (atau properti objek) gagal jika didefinisikan dengan falsenilai boolean . Kaisar peringatan :)

lucsorel
sumber
0

Kedua nilai dapat dengan mudah dibedakan dengan menggunakan operator perbandingan ketat:

Contoh kerja di:

http://www.thesstech.com/tryme?filename=nullandundefined

Kode sampel:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}
Sohail Arif
sumber
0

Jika tujuan pernyataan if adalah untuk memeriksa nullatau undefinedmenilai 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).

const a = some_variable ?? '';

Ini akan memastikan bahwa variabel akan ditugaskan ke string kosong (atau nilai default lainnya) jika some_variableada nullatau undefined.

Operator ini paling cocok untuk kasus penggunaan Anda, karena tidak mengembalikan nilai default untuk jenis nilai falsy lainnya seperti 0dan ''.

gojun
sumber
-1

Anda harus mendefinisikan fungsi dari formulir ini:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}
lofre
sumber
Itu akan menghasilkan ReferenceError yang sama jika variabel tidak dideklarasikan.
Chad
-1

Dalam ES5 atau ES6 jika Anda perlu memeriksanya beberapa kali, Anda dapat melakukannya:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}

vladernn
sumber
-1

Dengan Ramda, Anda cukup melakukan R.isNil(yourValue) Lodash dan perpustakaan pembantu lainnya memiliki fungsi yang sama.

Mark Jackson
sumber