Cara memeriksa variabel yang tidak didefinisikan dalam JavaScript

913

Saya ingin memeriksa apakah variabelnya didefinisikan atau tidak. Misalnya, berikut ini melempar kesalahan yang tidak didefinisikan

alert( x );

Bagaimana saya bisa menangkap kesalahan ini?

Jineesh
sumber
1
Ini bukan duplikat dari duplikat yang ditandai. Resolusi variabel dan resolusi properti objek adalah hal yang sangat berbeda. Duplikat yang lebih baik adalah bagaimana memeriksa apakah ada variabel di javascript? .
RobG
Kesalahan Anda disebabkan oleh variabel yang tidak dideklarasikan. Sebagian besar jawaban difokuskan pada tugas. Lihat jawaban saya untuk lebih lanjut. Selain itu banyak dari mereka salah menyatakan bahwa null dan undefined adalah objek dalam JavaScript. Mereka primitif , bukan benda ...
JBallin

Jawaban:

1691

Dalam JavaScript, nulladalah sebuah objek. Ada nilai lain untuk hal-hal yang tidak ada undefined,. DOM kembali nulluntuk hampir semua kasus di mana gagal menemukan beberapa struktur dalam dokumen, tetapi dalam JavaScript sendiri undefinedadalah nilai yang digunakan.

Kedua, tidak, tidak ada padanan langsung. Jika Anda benar-benar ingin memeriksa secara spesifik null, lakukan:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Jika Anda ingin memeriksa apakah suatu variabel ada, itu hanya dapat dilakukan dengan try/ catch, karena typeofakan memperlakukan variabel yang tidak dideklarasikan dan variabel yang dideklarasikan dengan nilai undefinedsetara.

Tetapi, untuk memeriksa apakah suatu variabel dinyatakan dan tidak undefined:

if (yourvar !== undefined) // Any scope

Sebelumnya, perlu menggunakan typeofoperator untuk memeriksa tidak terdefinisi dengan aman, karena itu mungkin untuk menetapkan kembali undefinedseperti variabel. Cara lama terlihat seperti ini:

if (typeof yourvar !== 'undefined') // Any scope

Masalah undefinedpenugasan kembali diperbaiki di ECMAScript 5, yang dirilis pada 2009. Sekarang Anda dapat menggunakan ===dan !==menguji dengan aman undefinedtanpa menggunakan typeofseperti yang undefinedtelah dibaca-hanya untuk beberapa waktu.

Jika Anda ingin tahu apakah ada anggota yang independen tetapi tidak peduli apa nilainya:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Jika Anda ingin mengetahui apakah suatu variabel adalah truthy :

if (yourvar)

Sumber

Natrium
sumber
71
undefined bukan kata yang dilindungi undang-undang; Anda (atau kode orang lain) dapat melakukan "undefined = 3" dan itu akan merusak dua tes Anda.
Jason S
6
"Jika Anda tahu variabelnya ada tetapi tidak tahu apakah ada nilai yang tersimpan di dalamnya" - ya ?!
Jason S
36
Saya pikir dia merujuk ke variabel yang dideklarasikan yang belum ditugaskan. misalnya: var foo; // foo ada tetapi tidak memiliki nilai
Wally Lawless
3
Hmmm ... Saya baru saja melihat tautan "sumber": seluruh posting ini adalah kutipan langsung dari milis, & mungkin harus diedit untuk membuatnya lebih jelas, karena penulis asli tidak tersedia untuk menjelaskan.
Jason S
11
"Dalam JavaScript null adalah objek.", Itu tidak benar-benar benar, dan mungkin, penyebab kesalahpahaman ini adalah typeofoperator ( typeof null == 'object'). The nullnilai adalah nilai primitif , yang merupakan satu-satunya nilai dari jenis Null .
CMS
347

Satu-satunya cara untuk benar-benar menguji apakah suatu variabel undefinedadalah dengan melakukan hal berikut. Ingat, undefined adalah objek dalam JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Beberapa solusi lain di utas ini akan membuat Anda percaya bahwa suatu variabel tidak terdefinisi meskipun telah didefinisikan (dengan nilai NULL atau 0, misalnya).

Michael Wales
sumber
18
Karena pertanyaannya TIDAK DILAKUKAN di sini harus menjadi typeVar! == 'tidak terdefinisi', kan?
eomeroff
1
Sungguh, saya tidak berpikir bahwa undefinded adalah sebuah objek, periksa dokumentasi terlebih dahulu developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus
2
Satu-satunya tes yang tidak menghasilkan a ReferenceError.
Nostalg.io
2
Kode ini benar, tapi saya pikir mengatakan undefinedobjek dalam javascript adalah informasi yang salah. Apakah pernyataan ini berhubungan dengan jawaban Anda? Ini adalah nilai undefinedtipe undefined, ditugaskan ke pengenal global bernama undefined.
SimplGy
1
Ini sekarang salah dalam hal itu menjadi satu-satunya cara. undefinedtelah dibaca hanya sejak ES5. Anda dapat dengan aman menguji terdefinisi menggunakan if (x === undefined) {...}atau menggunakan singkatan seperti ini: if (x === void 0).
Stephen M Irving
66

Secara teknis, solusi yang tepat adalah (saya percaya):

typeof x === "undefined"

Anda terkadang bisa malas dan menggunakannya

x == null

tetapi itu memungkinkan kedua variabel x yang tidak didefinisikan, dan variabel x yang berisi nol, untuk mengembalikan true.

Jason S
sumber
1
jika Anda mengetik var x;dan kemudian typeof x;Anda akan mendapatkan "undefined"seperti jika Anda melakukannyatypeof lakjdflkdsjflsj;
Muhammad Umer
Jadi tidak ada cara untuk memeriksa variabel yang tidak terdefinisi tetapi dideklarasikan?
Muhammad Umer
1
Saya kira tidak; Saya tidak yakin mengapa Anda menginginkannya.
Jason S
ujndefined tidak boleh berada di antara
apices
apa maksudmu dengan apeks?
Jason S
19

Versi yang lebih mudah dan lebih singkat adalah:

if (!x) {
   //Undefined
}

ATAU

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Dmitri Farkov
sumber
26
potongan kode pertama bisa salah jika x sedang diatur dari panggilan fungsi. seperti x = A (); jika A tidak mengembalikan apa pun, itu akan mengembalikan "tidak terdefinisi" secara default. Melakukan a! X akan benar yang secara logis benar. Namun, jika A () mengembalikan 0 maka! X harus salah karena x = 0. Namun di JS,! 0 juga benar.
Rajat
kode kedua dapat disingkat menjadi: if (! typeof (XX)) {...} else {...}
Alejandro Silva
2
@AlejandroSilva Maaf atas keterlambatan balasan. Itu tidak akan berfungsi karena typeof mengembalikan sebuah string, jadi itu akan mengembalikan 'tidak terdefinisi' untuk variabel tidak terdefinisi, yang pada gilirannya akan mengevaluasi sebagai TRUE karena itu mengarah ke false false dari var yang ditentukan.
Dmitri Farkov
5
Harap singkirkan cuplikan pertama, itu hanya buruk
Juan Mendes
1
Komentar lain menunjukkan bahwa contoh pertama itu buruk, tetapi tidak jelas mengapa. Jadi, untuk coders baru:! X tidak menguji apakah x didefinisikan, tetapi apakah itu benar. String, boolean true, dan positive number semuanya benar (dan saya mungkin lupa beberapa hal), tetapi nilai potensial lainnya yang valid seperti 0, boolean false, dan string kosong tidak benar. Contoh pertama dapat berfungsi untuk kasus penggunaan khusus (mis., Menguji string jika Anda dapat memperlakukan kosong sama dengan tidak terdefinisi), tetapi karena banyak yang tidak mau, itu tidak boleh dianggap sebagai cara default untuk memeriksa.
cfc
16

Saya sudah sering melakukan:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Joe
sumber
9
Pertimbangkan untuk mengubah "==" ke "===". Jika Anda memanggil doSomething (null) Anda juga akan mendapatkan peringatan. Kecuali jika itu yang Anda inginkan.
Jason S
Ya. Anda harus memutuskan apakah Anda ingin setara atau persis sama. Kasus mana pun bisa digunakan.
Joe
1
cukup periksa seperti ini-> jika (typeof variableName! == 'undefined') {alert (variableName);}
Muhammad Sadiq
ini tidak berguna karena Anda tidak akan dapat meneruskan var yang tidak terdefinisi ke suatu fungsi
avalanche1
2
Tentu kamu bisa. Coba panggil fungsi tanpa argumen.
Joe
3

Anda juga dapat menggunakan operator kondisional ternary:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

John
sumber
Bagaimana jika var a = false;? Anda harus memeriksa bahwa jika a===undefinedsebaliknya
Iter Ator
1
Pertanyaan: periksa variabel yang tidak didefinisikan ..... Ini adalah variabel yang tidak ditentukan: var x; melakukan di atas akan menimbulkan kesalahan
Muhammad Umer
"Jika a = false, maka itu akan menunjukkan" saya tidak tahu 'a' "" - Itulah masalahnya, pertanyaannya adalah untuk menguji apakah itu didefinisikan, bukan apakah itu benar. Jika a didefinisikan sebagai false, maka a tidak terdefinisi. Ini mengembalikan hasil yang salah dalam kasus itu. Lihat komentar saya di stackoverflow.com/a/858270/2055492 untuk detail lebih lanjut tentang mengapa pendekatan ini tidak berhasil.
cfc
tidak hanya akan !amenguji true untuk undefined, itu juga menguji true untuk 0dan nulldan false. Ini sangat salah dan harus dihapus.
Stephen M Irving
2

Saya sering menggunakan cara paling sederhana:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

EDIT:

Tanpa menginisialisasi variabel, pengecualian akan dilemparkan "Uncaught ReferenceError: variabel tidak didefinisikan ..."

mokiSRB
sumber
2
Uncaught ReferenceError: variable is not defined
Muhammad Umer
@MuhammadUmer, salah! variabledidefinisikan oleh var variable;. Dan cuplikan ini akan menimpa variabledalam cakupan lokal. Itu dapat mematahkan logika yang mengharapkan untuk mengakses variabel penutupan atau global. Yaitu:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев
2

"Solusi" potensial lain adalah menggunakan windowobjek. Ini menghindari masalah kesalahan referensi saat di browser.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
ubershmekel
sumber
Ini tidak menyelesaikan pertanyaan asli sama sekali dan sama sekali tidak relevan. Poster tidak bertanya bagaimana cara menguji apakah sesuatu itu benar atau salah, dia bertanya bagaimana cara menguji undefined. Ini tidak akan melakukan itu.
Stephen M Irving
2

Kesalahan memberitahu Anda bahwa xitu bahkan tidak ada! Itu belum dideklarasikan , yang berbeda dari diberi nilai.

var x; // declaration
x = 2; // assignment

Jika Anda menyatakan x, Anda tidak akan mendapatkan kesalahan. Anda akan mendapatkan lansiran yang mengatakan undefinedkarena xada / telah dinyatakan tetapi belum diberi nilai.

Untuk memeriksa apakah variabel telah dideklarasikan, Anda dapat menggunakan typeof, metode lain untuk memeriksa apakah ada variabel akan meningkatkan kesalahan yang sama yang Anda dapatkan pada awalnya.

if(typeof x  !==  "undefined") {
    alert(x);
}

Ini memeriksa jenis nilai yang disimpan di x. Ini hanya akan kembali undefinedketika xbelum dinyatakan OR jika telah dinyatakan dan belum ditetapkan.

JBallin
sumber
undefined telah dibaca sejak ES5 (rilis 2009) dan Anda tidak lagi membutuhkan typeofoperator.
Stephen M Irving
2

The voidOperator kembali undefineduntuk setiap argumen / ekspresi berlalu untuk itu. sehingga Anda dapat menguji hasilnya (sebenarnya beberapa minifiers mengubah kode Anda dari undefinedmenjadi void 0untuk menyimpan beberapa karakter)

Sebagai contoh:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
svarog
sumber
Ding ding! Ini jawaban yang benar. Malu itu semua jalan di bagian bawah. Semua orang begitu terpaku untuk tetap menggunakan typeofdan berpikir undefineddapat dipindahkan, yang tidak mungkin terjadi selama sekitar satu dekade.
Stephen M Irving
Ini juga aman sebelum ES5 karena saat itu bahkan jika Anda telah ditugaskan undefined, karena hanya Tuhan yang tahu alasannya, menggunakan void 0akan selalu kembali undefinedterlepas dari apa pun.
Stephen M Irving
1

Kami dapat memeriksa undefinedsebagai berikut

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
Arshid KV
sumber
1

Lakukan sesuatu seperti di bawah ini:

function isNotDefined(value) {
  return typeof value === "undefined";
}

dan menyebutnya seperti:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
Alireza
sumber
0

Jawaban yang diterima benar. Hanya ingin menambahkan satu opsi lagi. Anda juga dapat menggunakan try ... catchblokir untuk menangani situasi ini. Contoh aneh:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Waspadai catchblok, yang agak berantakan, karena menciptakan lingkup level blok. Dan, tentu saja, contohnya sangat disederhanakan untuk menjawab pertanyaan yang diajukan, itu tidak mencakup praktik terbaik dalam penanganan kesalahan;).

Евгений Савичев
sumber
0

Saya menggunakan fungsi kecil untuk memverifikasi variabel telah dideklarasikan, yang benar-benar mengurangi jumlah kekacauan dalam file javascript saya. Saya menambahkan tanda centang untuk nilai untuk memastikan bahwa variabel tidak hanya ada, tetapi juga telah diberi nilai. Kondisi kedua memeriksa apakah variabel juga telah dipakai, karena jika variabel telah didefinisikan tetapi tidak dipakai (lihat contoh di bawah), itu masih akan menimbulkan kesalahan jika Anda mencoba untuk referensi itu nilainya dalam kode Anda.

Tidak dipakai - var my_variable;Instantiated -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Anda kemudian dapat menggunakan pernyataan kondisional untuk menguji bahwa variabel telah didefinisikan DAN dipakai seperti ini ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

atau untuk menguji bahwa itu belum didefinisikan dan digunakan instantiated ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
MistyDawn
sumber
1
Mengapa tidak segera mengembalikan predikat Anda? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski