Bagaimana cara saya memeriksa nilai nol dalam JavaScript?


576

Bagaimana saya bisa mengecek nilai null dalam JavaScript? Saya menulis kode di bawah ini tetapi tidak berhasil.

if (pass == null || cpass == null || email == null || cemail == null || user == null) {      

    alert("fill all columns");
    return false;  

}   

Dan bagaimana saya bisa menemukan kesalahan dalam program JavaScript saya?


Apakah Anda yakin nilai yang Anda uji sebenarnya nol dan bukan hanya string kosong?
Jan-Peter Vos

72
pengujian nulldi js harus dilakukan dengan operator yang ketat===
davin

3
@davin - benar, tetapi bukan masalah di sini karena jika itu pernyataan masih akan bekerja.
Mark Kahn

3
@ Kolonel, jika saya pikir itu masalah saya akan membuat komentar itu sebagai jawaban. Lihat kata-kata saya, saya jelas membuat pernyataan umum tentang bahasa sehubungan dengan praktik OP, dan tidak mengusulkan bahwa ini menyelesaikan masalahnya.
davin

2
@TRiG perubahan yang diajukan pada dasarnya mengubah sifat pertanyaan ke titik di mana jawaban (bukan hanya milikku) kehilangan konteks dan tidak masuk akal. Hasil edit seharusnya menjadi komentar.
ic3b3rg

Jawaban:


742

Javascript sangat fleksibel dalam hal memeriksa nilai "null". Saya menduga Anda sebenarnya mencari string kosong, dalam hal ini kode sederhana ini akan berfungsi:

if(!pass || !cpass || !email || !cemail || !user){

Yang akan memeriksa string kosong ( ""), null, undefined, falsedan nomor 0danNaN

Harap dicatat bahwa jika Anda secara khusus memeriksa angka, ini merupakan kesalahan umum untuk melewatkan 0metode ini, dan num !== 0lebih disukai (atau num !== -1atau ~num(kode hack yang juga memeriksa -1)) untuk fungsi yang kembali -1, misalnya indexOf)


4
Akan sangat berguna untuk mengetahui bagian mana dari tes ini yang nilainya. Terkadang Anda mencari yang khusus.
inorganik

2
Agak dari pernyataan terlambat, tapi ya, Anda dapat melakukan tes terhadap masing-masing @inorganik, lihat jawaban saya di bawah ini
WebWanderer

28
Pembaca, harap berhati-hati saat menggunakan jenis tes ini pada data numerik. Jangan gunakan !atau !!untuk menguji nullatau undefinedpada data yang biasanya numerik kecuali Anda juga ingin membuang nilai 0.
NickS

4
Jawabannya sendiri menyatakan ini: "... dan angka 0...". Saya percaya jawaban ini sangat sesuai untuk pertanyaan sebagaimana diberikan konteks (yang saya simpulkan adalah "nama pengguna, kata sandi, email"), mereka tidak memeriksa 0nilai. Namun, mengingat popularitas pertanyaan dan jawaban ini, saya setuju bahwa ada baiknya disebutkan dalam jawaban itu sendiri.
Mark Kahn

4
@Hendeca - rolls mata Go membaca kode dalam pertanyaan yang sebenarnya. Ini jelas menanyakan tentang nama pengguna dan kata sandi. Saya tidak menebak apa pun, saya hanya bersikap sopan. Anda terganggu oleh kenyataan bahwa saya menjawab apa yang mereka butuhkan dan bukan apa yang mereka tanyakan, yang tidak masuk akal. Ini SO, sebagian besar waktu orang tidak tahu apa yang seharusnya mereka minta. Dalam konteks pertanyaan awal, jawaban ini benar. Sekarang berhenti menambahkan noise.
Mark Kahn

420

Untuk memeriksa null, secara spesifik Anda akan menggunakan ini:

if (variable === null)

Tes ini akan HANYA lulus untuk nulldan tidak akan lulus untuk "", undefined, false, 0, atau NaN.

Selain itu, saya telah memberikan pemeriksaan absolut untuk setiap nilai "false-like" (yang akan mengembalikan nilai true !variable).

Catatan, untuk beberapa pemeriksaan absolut, Anda harus menerapkan penggunaan absolutely equals: ===dan typeof.

Saya telah membuat JSFiddle di sini untuk menunjukkan semua tes individu berfungsi

Ini adalah output dari setiap cek:

Null Test:

if (variable === null)

- variable = ""; (false) typeof variable = string

- variable = null; (true) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Empty String Test:

if (variable === '')

- variable = ''; (true) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number




Undefined Test:

if (typeof variable == "undefined")

-- or --

if (variable === undefined)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (true) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



False Test:

if (variable === false)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (true) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Zero Test:

if (variable === 0)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (true) typeof variable = number

- variable = NaN; (false) typeof variable = number



NaN Test:

if (typeof variable == 'number' && !parseFloat(variable) && variable !== 0)

-- or --

if (isNaN(variable))

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (true) typeof variable = number

Seperti yang Anda lihat, ini sedikit lebih sulit untuk diuji NaN;


9
Apa tujuan pengecekan tipe jika Anda menggunakan ===kesetaraan yang ketat? Terima kasih. Juga untuk tes NaN yang dapat Anda gunakan isNaN(value)yang akan kembali truehanya jika variabel sama dengan NaN.
Michael Malinovskij

16
Apakah ada kasus di mana variable === nulltetapi bukan tipe "objek"? Jika tidak, mengapa tidak menyederhanakan cek variable === null, membuang konjungsi kedua? Terima kasih.
Hunan Rostomyan

7
@HunanRostomyan Pertanyaan yang bagus, dan jujur, tidak, saya tidak berpikir ada. Anda kemungkinan besar cukup aman menggunakan variable === nullyang baru saja saya uji di sini di JSFiddle ini . Alasan saya juga menggunakan variabel `&& typeof === 'object'` tidak hanya untuk mengilustrasikan fakta menarik bahwa nullnilai adalah typeof object, tetapi juga untuk mengikuti aliran pemeriksaan lainnya. Tapi ya, sebagai kesimpulan, Anda aman untuk digunakan secara sederhana variable === null.
WebWanderer

1
jsfiddle.net/neoaptt/avt1cgem/1 Inilah jawaban ini yang dibagi menjadi beberapa fungsi. Tidak terlalu berguna, tetapi saya tetap melakukannya.
Neoaptt

1
Saya akan melakukan sesuatu yang hampir tidak pernah merupakan ide yang baik: ubah kode dalam jawaban ini. Secara khusus, hapus tes yang sama sekali tidak perlu untuk objek jenis, ketika memeriksa nol. Ini adalah cuplikan kode mendasar : bukan ide yang baik untuk membuat bahkan seorang pemula pun salah belajar bahwa mereka perlu melakukan tes verbose itu.
ToolmakerSteve

59

ganti saja ==dengan ===di semua tempat.

== adalah perbandingan kesetaraan yang longgar atau abstrak

=== adalah perbandingan kesetaraan yang ketat

Lihat artikel MDN tentang perbandingan kesetaraan dan kesamaan untuk lebih detail.


2
Ini hanya berfungsi jika Anda menganggap undefinedtidak null. Kalau tidak, itu akan menyebabkan banyak perilaku yang tidak terduga. Umumnya jika Anda tertarik pada nilai-nilai ini null/ undefinedtetapi tidak palsu, gunakan ==(salah satu dari beberapa kasus ketika Anda harus melakukannya).
Andrew Mao

2
@AndrewMao undefined bukan null : stackoverflow.com/a/5076962/753237
ic3b3rg

2
Saya yakin itulah yang dikatakan @AndrewMao. Kalimat pertamanya mungkin ditulis ulang "Ini hanya bekerja dalam situasi di mana tidak terdefinisi dan nol tidak setara praktis."
BobRodes

1
@BobRodes Terima kasih telah memperjelas tulisan saya yang buruk, saya menghargainya :)
Andrew Mao

@AndrewMao Terima kasih kembali. Dan saya tidak akan menyebut tulisan Anda buruk, secara pribadi; Saya akan mengatakan itu jauh lebih baik daripada rata-rata. :)
BobRodes

30

Operator kesetaraan yang ketat: -

Kami dapat memeriksa nol dengan ===

if ( value === null ){

}

Hanya dengan menggunakan if

if( value ) {

}

akan bernilai true jika nilainya tidak :

  • batal
  • tidak terdefinisi
  • NaN
  • string kosong ("")
  • Salah
  • 0

9

Peningkatan atas jawaban yang diterima dengan secara eksplisit memeriksa nulltetapi dengan sintaks yang disederhanakan:

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
}

// Test
let pass=1, cpass=1, email=1, cemail=1, user=1; // just to test

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
    console.log ("Yayy! None of them are null");
} else {
    console.log ("Oops! At-lease one of them is null");
}


6

Pertama, Anda memiliki pernyataan pengembalian tanpa badan fungsi. Kemungkinannya adalah bahwa itu akan menimbulkan kesalahan.

Cara yang lebih bersih untuk melakukan pemeriksaan Anda adalah dengan hanya menggunakan! operator:

if (!pass || !cpass || !email || !cemail || !user) {

    alert("fill all columns");

}

12
Kode itu mungkin dalam suatu fungsi, dia hanya tidak menunjukkannya;)
Mark Kahn

4

Anda bisa menggunakan try catch akhirnya

 try {
     document.getElementById("mydiv").innerHTML = 'Success' //assuming "mydiv" is undefined
 } catch (e) {

     if (e.name.toString() == "TypeError") //evals to true in this case
     //do something

 } finally {}   

Anda juga bisa melakukan throwkesalahan sendiri. Lihat ini .


1
Saya pikir ini memenuhi syarat sebagai kode 'paranoid'. jika Anda benar-benar menulis sesuatu seperti ini, itu akan dengan pemahaman bahwa "mydiv" tidak mungkin tidak ada. kita tidak boleh mencapai kode ini kecuali kita yakin itu masalahnya, dan kita akan memiliki banyak jalan seperti kode respons untuk memastikan kita percaya diri sebelum mencoba garis seperti itu.
calql8edkos

Jangan gunakan mencoba dan menangkap aliran kontrol. Ini bukan solusi yang baik.
Andrew S

4

Dalam JavaScript, tidak ada string yang sama dengan null.

Mungkin Anda diharapkan pass == nullbenar ketika passstring kosong karena Anda menyadari bahwa operator kesetaraan longgar ==melakukan jenis paksaan jenis tertentu.

Misalnya, ungkapan ini benar:

'' == 0

Sebaliknya, operator kesetaraan yang ketat ===mengatakan bahwa ini salah:

'' === 0

Mengingat itu ''dan 0secara longgar sama, Anda mungkin bisa menduga itu ''dan nullsecara longgar sama. Namun, tidak demikian.

Ungkapan ini salah:

'' == null

Hasil membandingkan sembarang string nulladalah salah. Karena itu, pass == nulldan semua tes Anda yang lain selalu salah, dan pengguna tidak pernah mendapat peringatan.

Untuk memperbaiki kode Anda, bandingkan setiap nilai dengan string kosong:

pass === ''

Jika Anda yakin itu passadalah string, pass == ''juga akan berfungsi karena hanya string kosong yang sama dengan string kosong. Di sisi lain, beberapa ahli mengatakan bahwa ini adalah praktik yang baik untuk selalu menggunakan kesetaraan ketat dalam JavaScript kecuali Anda secara spesifik ingin melakukan pemaksaan tipe yang dilakukan oleh operator kesetaraan longgar.

Jika Anda ingin tahu pasangan nilai apa yang secara longgar setara, lihat tabel "perbandingan kesamaan" di artikel Mozilla tentang topik ini .


4

untuk memeriksa undefined dan null dalam javascript Anda hanya perlu menulis yang berikut ini:

if (!var) {
        console.log("var IS null or undefined");
} else {
        console.log("var is NOT null or undefined");
}

6
! var benar dengan 0, "", NaN, dan false juga.
Matt

3

Ini adalah komentar pada solusi WebWanderer mengenai memeriksa NaN (saya belum punya cukup perwakilan untuk meninggalkan komentar resmi). Solusinya berbunyi sebagai

if(!parseInt(variable) && variable != 0 && typeof variable === "number")

tetapi ini akan gagal untuk bilangan rasional yang akan membulatkan ke 0, seperti variable = 0.1. Tes yang lebih baik adalah:

if(isNaN(variable) && typeof variable === "number")

1
Terima kasih telah menunjukkan bug Gabriel, saya telah memperbaiki jawaban saya. Selain itu, saya bisa memperbaiki tes dengan mengubah parseIntke parseFloat (yang seharusnya sudah jelas bagi saya di tempat pertama). Saya menghindari menggunakan isNanfungsi karena saya merasa seolah-olah banyak pengembang melihat fungsi seperti isNaNsemacam "kotak ajaib" yang nilai-nilai masuk dan booleans keluar, dan saya ingin uji lebih mendalam. Tapi ya, tes yang Anda sarankan akan bekerja dan baik-baik saja untuk digunakan. Maaf saya tidak melihat posting Anda sampai sekarang.
WebWanderer

1
Bagus, itu sepertinya berhasil. Terima kasih atas komentar tentang mengapa Anda menghindar isNaNjuga, saya bisa mendukung logika itu. Ada juga metode Underscore.js, yang tampaknya bahkan lebih membingungkan / blackbox, tetapi tetap perlu dicatat karena ia memanfaatkannya NaN !== NaN. Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
Gabriel

2

Sebenarnya saya pikir Anda mungkin perlu menggunakan if (value !== null || value !== undefined) karena jika Anda menggunakan if (value)Anda juga dapat memfilter 0 atau nilai yang salah.

Pertimbangkan dua fungsi ini:

const firstTest = value => {
    if (value) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}
const secondTest = value => {
    if (value !== null && value !== undefined) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}

firstTest(0);            // result: failed
secondTest(0);           // result: passed

firstTest(false);        // result: failed
secondTest(false);       // result: passed

firstTest('');           // result: failed
secondTest('');          // result: passed

firstTest(null);         // result: failed
secondTest(null);        // result: failed

firstTest(undefined);    // result: failed
secondTest(undefined);   // result: failed

Dalam situasi saya, saya hanya perlu memeriksa apakah nilainya nol dan tidak terdefinisi dan saya tidak ingin menyaring 0atau falseatau ''nilai. jadi saya menggunakan tes kedua, tetapi Anda mungkin perlu menyaringnya juga yang dapat menyebabkan Anda menggunakan tes pertama.


1

Saya menemukan cara lain untuk menguji apakah nilainya nol:

if(variable >= 0 && typeof variable === "object")

nullbertindak sebagai numberdan objectpada saat yang sama. Membandingkan null >= 0atau null <= 0menghasilkan true. Membandingkan null === 0atau null > 0atau null < 0akan menghasilkan false. Tetapi seperti nulljuga objek kita dapat mendeteksinya sebagai null.

Saya membuat fungsi yang lebih kompleks natureof penyihir akan melakukan lebih baik dari typeof dan bisa dikatakan jenis apa untuk memasukkan atau terus dikelompokkan

/* function natureof(variable, [included types])
included types are 
    null - null will result in "undefined" or if included, will result in "null"
    NaN - NaN will result in "undefined" or if included, will result in "NaN"
    -infinity - will separate negative -Inifity from "Infinity"
    number - will split number into "int" or "double"
    array - will separate "array" from "object"
    empty - empty "string" will result in "empty" or
    empty=undefined - empty "string" will result in "undefined"
*/
function natureof(v, ...types){
/*null*/            if(v === null) return types.includes('null') ? "null" : "undefined";
/*NaN*/             if(typeof v == "number") return (isNaN(v)) ? types.includes('NaN') ? "NaN" : "undefined" : 
/*-infinity*/       (v+1 === v) ? (types.includes('-infinity') && v === Number.NEGATIVE_INFINITY) ? "-infinity" : "infinity" : 
/*number*/          (types.includes('number')) ? (Number.isInteger(v)) ? "int" : "double" : "number";
/*array*/           if(typeof v == "object") return (types.includes('array') && Array.isArray(v)) ? "array" : "object";
/*empty*/           if(typeof v == "string") return (v == "") ? types.includes('empty') ? "empty" : 
/*empty=undefined*/ types.includes('empty=undefined') ? "undefined" : "string" : "string";
                    else return typeof v
}

// DEMO
let types = [null, "", "string", undefined, NaN, Infinity, -Infinity, false, "false", true, "true", 0, 1, -1, 0.1, "test", {var:1}, [1,2], {0: 1, 1: 2, length: 2}]

for(i in types){
console.log("natureof ", types[i], " = ", natureof(types[i], "null", "NaN", "-infinity", "number", "array", "empty=undefined")) 
}


1

Saya membuat fungsi yang sangat sederhana ini bekerja dengan sangat baik:

function safeOrZero(route) {
  try {
    Function(`return (${route})`)();
  } catch (error) {
    return 0;
  }
  return Function(`return (${route})`)();
}

Rute adalah rantai nilai apa pun yang dapat meledak. Saya menggunakannya untuk jQuery / cheerio dan objek dan semacamnya.

Contoh 1: objek sederhana seperti ini const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};.

Tapi itu bisa menjadi benda yang sangat besar yang bahkan belum kita buat. Jadi saya melewati itu:

let value1 = testobj.items[2].val;  // "hum!"
let value2 = testobj.items[3].val;  // Uncaught TypeError: Cannot read property 'val' of undefined

let svalue1 = safeOrZero(`testobj.items[2].val`)  // "hum!"
let svalue2 = safeOrZero(`testobj.items[3].val`)  // 0

Tentu saja jika Anda mau, Anda dapat menggunakan nullatau 'No value'... Apa pun yang sesuai dengan kebutuhan Anda.

Biasanya kueri DOM atau pemilih jQuery dapat menimbulkan kesalahan jika tidak ditemukan. Tetapi menggunakan sesuatu seperti:

const bookLink = safeOrZero($('span.guidebook > a')[0].href);
if(bookLink){
  [...]
}

1

Anda dapat menggunakan modul lodash untuk memeriksa nilainya nol atau tidak terdefinisi

_.isNil(value)
Example 

 country= "Abc"
    _.isNil(country)
    //false

   state= null
    _.isNil(state)
    //true

city= undefined
    _.isNil(state)
    //true

   pin= true
    _.isNil(pin)
    // false   

Tautan referensi: https://lodash.com/docs/#isNil


0

Ini tidak akan berfungsi jika nilai Boolean berasal dari DB untuk contoh:

 value = false

 if(!value) {
   // it will change all false values to not available
   return "not available"
 }

0

AFAIK dalam JAVASCRIPT ketika suatu variabel dideklarasikan tetapi belum menetapkan nilainya, tipenya adalah undefined. sehingga kita dapat memeriksa variabel bahkan jika itu akan menjadi objectmemegang beberapa contoh di tempat nilai .

buat metode pembantu untuk memeriksa nullity yang kembali truedan menggunakannya dalam API Anda.

fungsi helper untuk memeriksa apakah variabel kosong:

function isEmpty(item){
    if(item){
        return false;
    }else{
        return true;
    }
}

coba-tangkap panggilan API luar biasa:

try {

    var pass, cpass, email, cemail, user; // only declared but contains nothing.

    // parametrs checking
    if(isEmpty(pass) || isEmpty(cpass) || isEmpty(email) || isEmpty(cemail) || isEmpty(user)){
        console.log("One or More of these parameter contains no vlaue. [pass] and-or [cpass] and-or [email] and-or [cemail] and-or [user]");
    }else{
        // do stuff
    }

} catch (e) {
    if (e instanceof ReferenceError) {
        console.log(e.message); // debugging purpose
        return true;
    } else {
        console.log(e.message); // debugging purpose
        return true;
    }
}

beberapa kasus uji:

var item = ""; // isEmpty? true
var item = " "; // isEmpty? false
var item; // isEmpty? true
var item = 0; // isEmpty? true
var item = 1; // isEmpty? false
var item = "AAAAA"; // isEmpty? false
var item = NaN; // isEmpty? true
var item = null; // isEmpty? true
var item = undefined; // isEmpty? true

console.log("isEmpty? "+isEmpty(item));

1
Apa? Jawaban ini tidak ada hubungannya dengan posting ini. Apakah Anda memposting jawaban ini di utas ini secara tidak sengaja?
WebWanderer

isEmptyFungsi ini berperilaku persis seperti !. Tidak perlu menemukan fungsi. Lakukan saja if (!pass || !cpass || !email ...). (Yang sudah ditunjukkan dalam jawaban yang diterima.) Dan menurut komentar WebWanderer, bagian tengah dari postingan ini, "coba-coba panggilan API luar biasa", tampaknya tidak relevan dengan pertanyaan ini. Tolong jelaskan maksud Anda - kapan itu berguna? Bagaimana hubungannya dengan pertanyaan itu?
ToolmakerSteve

0

Memeriksa kondisi kesalahan:

// Typical API response data
let data = {
  status: true,
  user: [],
  total: 0,
  activity: {sports: 1}
}

// A flag that checks whether all conditions were met or not
var passed = true;

// Boolean check
if (data['status'] === undefined || data['status'] == false){
  console.log("Undefined / no `status` data");
  passed = false;
}

// Array/dict check
if (data['user'] === undefined || !data['user'].length){
  console.log("Undefined / no `user` data");
  passed = false;
}

// Checking a key in a dictionary
if (data['activity'] === undefined || data['activity']['time'] === undefined){
   console.log("Undefined / no `time` data");
   passed = false;
}

// Other values check
if (data['total'] === undefined || !data['total']){
  console.log("Undefined / no `total` data");
  passed = false;
}

// Passed all tests?
if (passed){
  console.log("Passed all tests");
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.