JavaScript memeriksa null vs undefined dan perbedaan antara == dan ===

579
  1. Bagaimana cara memeriksa variabel jika itu nullatau undefineddan apa perbedaan antara nulldan undefined?

  2. Apa perbedaan antara ==dan ===(sulit untuk mencari Google untuk "===")?

MUG4N
sumber
10
2. Perbedaan antara ==dan dijelaskan dengan=== baik di sini .
Uzbekjon
1. Gunakan === Alih-alih == JavaScript menggunakan dua jenis operator kesetaraan: === | ! == dan == | ! = Ini dianggap praktik terbaik untuk selalu menggunakan set sebelumnya saat membandingkan. "Jika dua operan memiliki jenis dan nilai yang sama, maka === menghasilkan true dan! == menghasilkan false." - JavaScript: Bagian Yang Baik Namun, ketika bekerja dengan == dan! =, Anda akan mengalami masalah ketika bekerja dengan berbagai jenis. Dalam kasus ini, mereka akan mencoba untuk memaksa nilai-nilai itu, tidak berhasil. code.tutsplus.com/tutorials/…
jasonleonhard
4
Anda dapat mencari di Google untuk: "operator kesetaraan yang ketat" - yang mengambil hasil yang sangat relevan
Danield
Hanya dengan menambahkan banyak jawaban di sini, Anda dapat menggunakan fungsi lodash.com/docs#isNil untuk memeriksa apakah variabelnya null atau tidak terdefinisi
Kfir Erez

Jawaban:

936

Bagaimana cara saya memeriksa variabel jika nullatau undefined...

Apakah variabel null:

if (a === null)
// or
if (a == null) // but see note below

... tetapi perhatikan yang terakhir juga akan benar jika aada undefined.

Apakah itu undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

... tapi sekali lagi, perhatikan bahwa yang terakhir tidak jelas; itu juga akan benar kalau aada null.

Sekarang, terlepas dari hal di atas, cara yang biasa untuk memeriksa itu adalah dengan menggunakan fakta bahwa mereka palsu :

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

Ini didefinisikan oleh ToBoolean dalam spec.

... dan apa perbedaan antara nulldan undefined?

Keduanya adalah nilai yang biasanya digunakan untuk menunjukkan tidak adanya sesuatu. undefinedadalah yang lebih umum, digunakan sebagai nilai default variabel sampai mereka diberi nilai lain, sebagai nilai argumen fungsi yang tidak disediakan ketika fungsi dipanggil, dan sebagai nilai yang Anda dapatkan ketika Anda meminta objek untuk properti yang tidak dimilikinya. Tetapi itu juga dapat secara eksplisit digunakan dalam semua situasi itu. (Ada perbedaan antara objek yang tidak memiliki properti, dan memiliki properti dengan nilai undefined; ada perbedaan antara memanggil fungsi dengan nilai undefineduntuk argumen, dan meninggalkan argumen itu sepenuhnya.)

nullsedikit lebih spesifik daripada undefined: Ini adalah referensi objek kosong. JavaScript diketik secara longgar, tentu saja, tetapi tidak semua hal yang berinteraksi dengan JavaScript diketik secara longgar. Jika API seperti DOM di browser membutuhkan referensi objek yang kosong, kami menggunakan null, bukan undefined. Dan juga, getElementByIdoperasi DOM mengembalikan referensi objek - baik yang valid (jika menemukan elemen DOM), atau null(jika tidak).

Menariknya (atau tidak), mereka tipe mereka sendiri. Artinya, nulladalah satu-satunya nilai dalam tipe Null, dan undefinedmerupakan satu-satunya nilai dalam tipe Undefined.

Apa perbedaan antara "==" dan "==="

Satu-satunya perbedaan di antara mereka adalah yang ==akan melakukan tipe paksaan untuk mencoba mendapatkan nilai yang cocok, dan ===tidak mau. Jadi misalnya "1" == 1benar, karena "1"paksaan untuk 1. Tetapi "1" === 1itu salah , karena tipenya tidak cocok. ( "1" !== 1Benar.) Langkah pertama (nyata) ===adalah "Apakah jenis operan sama?" dan jika jawabannya "tidak", hasilnya adalah false. Jika tipenya sama, ia melakukan apa yang ==dilakukannya.

Jenis paksaan menggunakan aturan yang cukup rumit dan dapat memberikan hasil yang mengejutkan (misalnya, "" == 0benar).

Lebih banyak di spec:

TJ Crowder
sumber
122
Untuk menyaring jawaban TJ, === berarti nilai DAN jenisnya sama.
Slappy
13
@Slappy: :-) @ MUG4N: Ya, benar. if (a) { ... }akan berarti "jika aitu benar," di mana "benar" adalah nilai yang tidak nol, tidak nol, tidak terdefinisi, tidak palsu, tidak kosong. :-)
TJ Crowder
4
Um ... apakah para downvoter mau membagikan beberapa umpan balik yang bermanfaat mengenai mengapa Anda pikir ini "tidak berguna" (mengutip tooltip tombol downvote)?
TJ Crowder
2
@ Željko: Saya pikir Crockford mungkin salah dalam hal ini. Memang benar itu nullbukan objek , itu referensi objek yang berarti "tidak ada objek". Ini penting, karena yang digunakan dengan antarmuka yang disediakan oleh host ketika mereka memberikan referensi objek tetapi tidak memiliki satu untuk menyediakan (misalnya, node.nextSiblingkapan nodeelemen terakhir dalam induknya, atau getElementByIdketika tidak ada elemen dengan ID itu). Teknologi yang digunakan oleh tuan rumah untuk ini mungkin tidak sefleksibel JavaScript adalah tentang jenis variabel / properti, jadi itu perlu untuk memiliki objek nullref (sebagai lawan dari undefined).
TJ Crowder
2
Saya harus setuju bahwa Crockford salah. typeof nullmengembalikan "objek" masuk akal. Satu-satunya nilai lain yang masuk akal adalah "nol", karena pasti mengembalikan sesuatu yang berbeda typeof undefined. null mewakili referensi objek nol, yang, paling tidak, berarti variabel yang menahannya dimaksudkan untuk beberapa jenis 'objek'. Jika itu adalah kesalahan, itu adalah kesalahan yang baik. Bagaimanapun, dalam hal jawabannya, tip tentang undefined! == undefinedselama skrip lintas-jendela baik untuk diketahui, terutama untuk tujuan debugging.
Triynko
93

Perbedaannya halus.

Dalam JavaScript, undefinedvariabel adalah variabel yang tidak pernah dideklarasikan, atau tidak pernah diberi nilai. Katakanlah Anda menyatakan var a;misalnya, maka aakan menjadi undefined, karena tidak pernah diberi nilai apa pun.

Tetapi jika Anda kemudian menetapkan a = null;maka asekarang akan null. Dalam JavaScript nulladalah sebuah objek (coba typeof nulldi konsol JavaScript jika Anda tidak percaya kepada saya), yang berarti bahwa null adalah sebuah nilai (bahkan sebenarnya undefinedadalah sebuah nilai).

Contoh:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

Ini terbukti bermanfaat dalam argumen fungsi. Anda mungkin ingin memiliki nilai default, tetapi anggap null diterima. Dalam hal ini Anda dapat melakukan:

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

Jika Anda menghilangkan optionalparameter doSomething(1, 2) thenopsional akan menjadi "three"string tetapi jika Anda lulus doSomething(1, 2, null)maka opsional akan menjadi null.

Adapun pembanding yang sama ==dan benar-benar sama ===, yang pertama adalah tipe lemah, sementara benar-benar sama juga memeriksa jenis nilai. Itu berarti 0 == "0"akan kembali benar; sementara 0 === "0"akan mengembalikan false, karena angka bukan string.

Anda dapat menggunakan operator tersebut untuk memeriksa antara undefinedsebuah null. Sebagai contoh:

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

Kasus terakhir menarik, karena memungkinkan Anda untuk memeriksa apakah suatu variabel tidak terdefinisi atau nol dan tidak ada yang lain:

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true
Julien Portalier
sumber
1
Kyle Simpson mengklaim typeof null mengembalikan "objek" adalah bug: github.com/getify/You-Dont-Know-JS/blob/master/…
bzrk
15

Spek adalah tempat untuk mencari jawaban penuh untuk pertanyaan-pertanyaan ini. Berikut ringkasannya:

  1. Untuk suatu variabel x, Anda dapat:

    • periksa apakah nullmenggunakan perbandingan langsung ===. Contoh:x === null
    • periksa apakah itu undefineddengan salah satu dari dua metode dasar: perbandingan langsung dengan undefinedatau typeof. Karena berbagai alasan , saya lebih suka typeof x === "undefined".
    • periksa apakah itu salah satu dari nulldan undefineddengan menggunakan ==dan bergantung pada aturan paksaan jenis yang sedikit misterius yang berarti x == nullmelakukan apa yang Anda inginkan.

  2. Perbedaan mendasar antara ==dan ===adalah bahwa jika operan memiliki tipe yang berbeda, ===akan selalu kembali falsesementara ==akan mengubah satu atau kedua operan menjadi tipe yang sama menggunakan aturan yang mengarah pada beberapa perilaku yang sedikit tidak intuitif. Jika operan memiliki tipe yang sama (misalnya keduanya adalah string, seperti dalam typeofperbandingan di atas), ==dan ===akan berperilaku sama persis.

Lebih banyak membaca:

Tim Down
sumber
9

Bagaimana cara saya memeriksa variabel apakah itu nol atau tidak terdefinisi

cukup periksa apakah suatu variabel memiliki nilai yang valid seperti ini:

if(variable)

itu akan mengembalikan true jika variabel tidak mengandung:

  • batal
  • tidak terdefinisi
  • 0
  • Salah
  • "" (string kosong)
  • NaN
Sumit Joshi
sumber
8

tidak terdefinisi

Itu berarti variabel belum diinternisasi.

Contoh:

var x;
if(x){ //you can check like this
   //code.
}

sama dengan (==)

Hanya memeriksa nilai sama dengan bukan tipe data.

Contoh:

var x = true;
var y = new Boolean(true);
x == y ; //returns true

Karena hanya memeriksa nilai.

Sama dengan Ketat (===)

Cek nilai dan tipe data harus sama.

Contoh:

var x = true;
var y = new Boolean(true);
x===y; //returns false.

Karena memeriksa datatype x adalah tipe primitif dan y adalah objek boolean.

kannanrbk
sumber
4

Iklan 1. nullbukan pengidentifikasi untuk properti objek global, seperti undefined dapat

Iklan 2. ===Nilai dan tipe cek. The ==dont memerlukan jenis yang sama dan membuat konversi implisit sebelum perbandingan (menggunakan .valueOf()dan .toString()). Di sini Anda memiliki semua ( src ):

jika

masukkan deskripsi gambar di sini

== (negasinya ! = )

masukkan deskripsi gambar di sini

=== (negasinya ! == )

masukkan deskripsi gambar di sini

Kamil Kiełczewski
sumber
1
perlu menyebutkan itu document.all == nulldandocument.all !== null
pengguna
1

Jika pemeriksaan (logis) Anda adalah negasi (!) Dan Anda ingin menangkap kedua JS nulldan undefined (karena Peramban yang berbeda akan memberi Anda hasil yang berbeda), Anda akan menggunakan perbandingan yang kurang ketat: misalnya:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

Ini akan menangkap keduanya nulldanundefined

DaniDev
sumber
0

Coba Dengan Logika Berbeda . Anda dapat menggunakan kode di bawah ini untuk memeriksa keempat (4) kondisi untuk validasi seperti tidak nol, tidak kosong, tidak terdefinisi dan tidak nol hanya menggunakan kode ini (! (! (Variabel))) dalam javascript dan jquery.

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

Ravikant
sumber