Як перевірити нульові значення в JavaScript?


573

Як я можу перевірити нульові значення в JavaScript? Я написав код нижче, але він не працював.

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

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

}   

І як я можу знайти помилки в своїх програмах JavaScript?


Ви впевнені, що значення, які ви тестуєте, насправді є нульовими, а не просто порожніми рядками?
Ян-Пітер Вос

72
тестування nullна js повинно проводитися із суворим оператором===
davin

3
@davin - правда, але тут не проблема, оскільки якби це твердження все-таки спрацювало б.
Марк Кан

3
@cwolves, якби я вважав, що це проблема, я би зробив цей коментар відповіддю. Ознайомтесь з моєю формулюванням, я чітко висловлюю загальну мову про мову, посилаючись на практику ОП, і не пропоную, щоб це вирішило його проблему.
Давін

2
@TRiG запропоновані зміни принципово змінюють характер питання до того, коли відповіді (не лише мої) втрачають контекст і не мають сенсу. Правка повинна бути просто коментарем.
ic3b3rg

Відповіді:


741

Javascript є дуже гнучким щодо перевірки наявності "null" значень. Я здогадуюсь, що ви насправді шукаєте порожні рядки, і в цьому випадку цей простіший код буде працювати:

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

Що буде перевіряти порожні рядки ( ""), null, undefined, falseі номера 0іNaN

Зауважте, що якщо ви спеціально перевіряєте наявність чисел, це звичайна помилка пропускати 0цей метод, і num !== 0його перевагу (або num !== -1або ~num(хакі-код, який також перевіряє -1) для функцій, які повертаються -1, наприклад indexOf)


4
Було б дуже корисно знати, які частини цього тесту для яких значень. Іноді ти шукаєш його зокрема.
inorganik

2
Трохи запізнення із заявою, але так, ви можете провести тест проти кожного @inorganik, дивіться мою відповідь нижче
WebWanderer

28
Читачі, будьте обережні, використовуючи цей тип тесту на числових даних. Не використовуйте !і !!не тестуйте для nullабо undefinedна типово числових даних, якщо ви також не хочете скидати значення 0.
NickS

4
У самій відповіді зазначено так: "... і числа 0...". Я вважаю, що ця відповідь цілком підходить для запитання, оскільки з огляду на контекст (який я підказую - "ім'я користувача, пароль, електронна пошта"), вони не перевіряють 0значення. Однак, враховуючи популярність цього питання та відповіді, я згоден, що це варто згадати у самій відповіді.
Марк Кан

4
@Hendeca - закочує очі Переходьте читати код у фактичному питанні. Це чітко запитує про імена користувачів та паролі. Я ні про що не здогадуюсь, я був просто ввічливим. Вас турбує той факт, що я відповів на те, що їм потрібно, а не те, що вони запитали, що абсурдно. Це ТАК, більшість часу люди не знають, що їм слід просити. У контексті оригінального питання ця відповідь правильна. Тепер перестаньте додавати шум.
Марк Кан

418

Щоб перевірити наявність нуля СПЕЦИФІЧНО, ви використовуєте це:

if (variable === null)

Цей тест буде тільки уславитися nullі не уславитися "", undefined, false, 0, або NaN.

Крім того, я забезпечив абсолютні перевірки на кожне значення "подібного до помилки" (те, для якого повернеться true !variable).

Зверніть увагу, для деяких абсолютних перевірок, вам необхідно буде здійснити використання з absolutely equals: ===і typeof.

Я створив тут JSFiddle, щоб показати всі окремі тести, що працюють

Ось результат кожної перевірки:

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

Як бачите, протестувати трохи складніше NaN;


9
Яка мета перевірки типу, якщо ви використовуєте ===сувору рівність? Дякую. Також для тесту NaN ви можете використовувати, isNaN(value)що повертається, trueлише якщо змінна дорівнює NaN.
Михайло Малиновський

16
Чи є випадок, коли, variable === nullале не типу "об'єкт"? Якщо ні, то чому б не спростити чек variable === null, викинувши другий сполучник? Дякую.
Хунан Ростомян

7
@HunanRostomyan Добре запитання, і якщо чесно, ні, я не думаю, що є. Ви, швидше за все, досить безпечні, використовуючи те, variable === nullщо я щойно перевірив у цій JSFiddle . Причиною того, що я також використовував `&& typeof змінної === 'object' ', було не тільки для того, щоб проілюструвати цікавий факт, що nullзначення є typeof object, а й утримати потоки інших перевірок. Але так, на закінчення ви безпечно користуватися просто variable === null.
WebWanderer

1
jsfiddle.net/neoaptt/avt1cgem/1 Ось ця відповідь розбита на функції. Не дуже корисно, але я це все одно робив.
Неоаптт

1
Я збираюся зробити щось, що майже ніколи не є гарною ідеєю: змінити код у цій відповіді. Зокрема, видаляйте абсолютно непотрібний тест для об'єкта типу під час перевірки на null. Це фундаментальний фрагмент коду: непогано мати навіть одного початківця, який неправильно дізнається, що їм потрібно зробити цей тест на багатослів’я.
ToolmakerSteve

59

просто замінити ==з ===у всіх місцях.

== - це порівняно порівняно рівне порівняння

=== є суворим порівнянням рівності

Детальніше дивіться статтю MDN про порівняння рівності та однаковість .


2
Це працює лише в тому випадку, якщо ви вважаєте, undefinedщо це не так null. Інакше це призведе до безлічі несподіваної поведінки. Як правило, якщо ви зацікавлені в обох null/ undefinedале не хибних значеннях, тоді використовуйте ==(один з небагатьох випадків, коли ви повинні це зробити).
Ендрю Мао

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

2
Я вважаю, що насправді сказав @AndrewMao. Його перше речення може бути переписане "Це працює лише в ситуаціях, коли невизначені та нульові значення не є практичними еквівалентами".
BobRodes

1
@BobRodes Дякую за пояснення мого поганого написання, я ціную це :)
Ендрю Мао

@AndrewMao Ви дуже раді. І особисто я б не назвав ваше писання бідним; Я б сказав, що це набагато краще, ніж в середньому. :)
BobRodes

30

Суворий оператор рівності: -

Ми можемо перевірити нульове значення ===

if ( value === null ){

}

Просто за допомогою if

if( value ) {

}

оцінюється як вірно, якщо значення не :

  • нуль
  • невизначений
  • NaN
  • порожній рядок ("")
  • помилковий
  • 0

9

Вдосконалення щодо прийнятої відповіді шляхом явної перевірки, nullале з спрощеним синтаксисом:

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

По-перше, у вас є твердження про повернення без функції функції. Ймовірно, що це призведе до помилки.

Більш чистим способом зробити перевірку було б просто використовувати! оператор:

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

    alert("fill all columns");

}

12
Цей код, ймовірно, є у функції, він просто його не показав;)
Марк Кан

4

ви можете використати спробу лову нарешті

 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 {}   

ви також можете throwзробити власні помилки. Дивіться це .


1
Я думаю, що це кваліфікується як "параноїчний" код. якби ви насправді щось подібне написали, це було б з розумінням того, що "mydiv" не може існувати. ми не повинні дійти до цього коду, якщо ми не впевнені, що це так, і ми мали б багато способів, таких як коди відповідей, щоб переконатися, що ми впевнені, перш ніж спробувати такий рядок.
calql8edkos

Не використовуйте спробу і лову для потоку контролю. Це не гарне рішення.
Andrew S

4

У JavaScript жодна рядок не дорівнює null.

Можливо, ви очікували, pass == nullщо це правда, коли passце порожня рядок, оскільки ви знаєте, що оператор вільної рівності ==виконує певні види примусу типу.

Наприклад, цей вираз вірний:

'' == 0

На відміну від цього, оператор суворої рівності ===говорить, що це помилково:

'' === 0

З огляду на , що ''і 0нещільно рівні, ви могли б розумно припущення , що ''і nullнещільно рівні. Однак їх немає.

Цей вираз помилковий:

'' == null

Результат порівняння будь-якого рядка з nullпомилковим. Тому pass == nullі всі ваші інші тести завжди помилкові, і користувач ніколи не отримує попередження.

Щоб виправити код, порівняйте кожне значення з порожнім рядком:

pass === ''

Якщо ви впевнені, що passце рядок, pass == ''це також буде працювати, оскільки лише порожня рядок вільно дорівнює порожній рядку. З іншого боку, деякі фахівці стверджують, що добре використовувати завжди строгу рівність у JavaScript, якщо ви конкретно не хочете виконувати примус типу, який виконує оператор вільної рівності.

Якщо ви хочете знати, які пари значень нерівні, див. Таблицю «Порівняння однаковості» у статті Mozilla на цю тему .


4

щоб перевірити наявність невизначеного та null в JavaScript, вам потрібно просто написати наступне:

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

6
! var вірно з 0, "", NaN і також false.
Метт

3

Це коментар до рішення WebWanderer щодо перевірки наявності NaN (у мене ще недостатньо представників, щоб залишити офіційний коментар). Рішення звучить як

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

але це не вдасться для раціональних чисел, які б округлилися до 0таких, як variable = 0.1. Кращим тестом було б:

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

1
Дякую, що вказали на помилку Габріеля, я поставив виправлення у своїй відповіді. Крім цього, мені вдалося виправити тест, змінивши parseIntнаparseFloat (що, мабуть, було очевидно для мене в першу чергу). Я уникав використовувати цю isNanфункцію, тому що мені здається, що багато розробників переглядають такі функції, як, наприклад, isNaNякась "магічна скринька", у яку входять значення і виходять булеві, і я хотів би зробити тест трохи більш глибоким. Але так, запропонований вами тест спрацює і його прекрасно використовувати. Вибачте, що я не помітив вашу публікацію до цього часу.
WebWanderer

1
Чудово, що, здається, працює. Дякую за коментар щодо того, чому ви також уникали isNaN, я можу зайти за цією логікою. Існує також метод Underscore.js, який здається ще більш заплутаним / blackbox, але все-таки варто зауважити, оскільки він використовує перевагиNaN !== NaN . Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
Габріель

2

Насправді я думаю, що вам може знадобитися використовувати, if (value !== null || value !== undefined) тому що якщо ви використовуєте, if (value)ви також можете фільтрувати 0 або помилкові значення.

Розглянемо ці дві функції:

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

У моїй ситуації мені просто потрібно було перевірити, чи значення є недійсним та не визначеним, і я не хотів фільтрувати 0чи не falseзадавати ''значення. тому я використав другий тест, але вам може знадобитися їх також фільтрувати, що може спричинити використання першого тесту.


1

Я знайшов інший спосіб перевірити, чи значення недійсне:

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

nullвиступає як numberі objectодночасно. Порівняння null >= 0або null <= 0результат у true. Порівняння null === 0або null > 0або null < 0призведе до помилкового. Але якnull це також об'єкт, ми можемо виявити його як нуль.

Я зробив складнішою функцію natureof відьма робитиме краще , ніж TYPEOF і можна сказати , що типи , щоб включити або тримати згруповані

/* 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

Я зробив цю дуже просту функцію, яка творить чудеса:

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

Маршрут - це будь-який ланцюжок цінностей, який може підірватися. Я використовую його для jQuery / cheerio та об'єктів тощо.

Приклади 1: простий об'єкт, такий як цей const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};.

Але це може бути дуже великий предмет, якого ми навіть не робили. Тому я передаю це через:

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

Звичайно, якщо ви віддаєте перевагу, можете використовувати nullабо 'No value'... Що б не відповідало вашим потребам.

Зазвичай запит DOM або селектор jQuery може видалити помилку, якщо її не знайдено. Але використовуючи щось на кшталт:

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

1

Ви можете використовувати модуль lodash, щоб перевірити значення нульового або невизначеного

_.isNil(value)
Example 

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

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

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

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

Посилання на посилання: https://lodash.com/docs/#isNil


0

Це не буде працювати у випадку булевих значень, що надходять із БД для:

 value = false

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

0

AFAIK в JAVASCRIPT, коли змінна оголошена, але не призначила значення, її тип є undefined. тож ми можемо перевірити змінну, навіть якщо це буде objectутримувати якийсь екземпляр замість значення .

створити допоміжний метод для перевірки недійсності, що повертається, trueі використовувати його у своєму API.

допоміжна функція, щоб перевірити, чи змінна порожня:

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

спробу вилову виняткового API:

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;
    }
}

кілька тестових випадків:

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
Що? Ця відповідь не має нічого спільного з цією публікацією. Ви опублікували цю відповідь на цю тему випадково?
WebWanderer

Ця isEmptyфункція поводиться точно так само !. Не потрібно вигадувати функцію. Просто роби if (!pass || !cpass || !email ...). (Що вже показано у прийнятій відповіді.) І за коментарем WebWanderer, середня частина цього допису, "випробування виняткового виклику API", не здається актуальною для цього питання. Поясніть, будь ласка, свій намір - коли це корисно? Як це стосується питання?
ToolmakerSteve

0

Перевірка умов помилки:

// 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");
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.