Как проверить наличие нулевых значений в JavaScript?

576

Как я могу проверить нулевые значения в JavaScript? Я написал код ниже, но он не работал.

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

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

}   

И как я могу найти ошибки в моих программах JavaScript?

Mahdi_Nine
источник
Вы уверены, что значения, которые вы тестируете, на самом деле являются нулевыми, а не просто пустой строкой?
Ян-Петер Вос
72
тестирование nullв js должно быть сделано со строгим оператором===
Дэвин
3
@davin - правда, но проблема не в этом, поскольку, если бы это было утверждение, все равно работало бы.
Марк Кан
3
@cwolves, если бы я думал, что это проблема, я бы ответил на этот комментарий. Проверьте мою формулировку, я четко делаю общее утверждение о языке со ссылкой на практику ФП и не предлагаю, чтобы это решило его проблему.
Дэвин
2
@ TRiG предлагаемые изменения в корне меняют природу вопроса до такой степени, что ответы (не только мои) теряют контекст и не имеют смысла. Редактирование должно быть просто комментарием.
ic3b3rg

Ответы:

744

Javascript очень гибок в отношении проверки «нулевых» значений. Я предполагаю, что вы на самом деле ищете пустые строки, и в этом случае этот более простой код будет работать:

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

Что будет проверять пустые строки ( ""), null, undefined, falseи номера 0иNaN

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

Марк Кан
источник
4
Было бы очень полезно узнать, какие части этого теста для каких значений. Иногда вы ищете что-то конкретное.
неорганик
2
Что-то вроде позднего заявления, но да, вы можете выполнить тест по каждому @inorganik, см. Мой ответ ниже
WebWanderer
28
Читатели, пожалуйста, будьте осторожны при использовании этого типа теста на числовых данных. Не используйте !или !!для проверки nullили undefinedдля типично числовых данных, если вы не хотите выбрасывать значения 0.
NickS
4
Сам ответ гласит: «... и цифры 0...». Я считаю, что этот ответ идеально подходит для вопроса, так как, учитывая контекст (который я понимаю, это «имя пользователя, пароль, электронная почта»), они не проверяют 0значения. Однако, учитывая популярность этого вопроса и ответа, я согласен, что стоит упомянуть в самом ответе.
Марк Кан
4
@ Хендека - закатывает глаза иди читай код в актуальном вопросе. Он четко спрашивает об именах пользователей и паролях. Я ни о чем не догадываюсь, я просто был вежлив. Тебя беспокоит тот факт, что я ответил на то, что им нужно, а не на то, что они спросили, что абсурдно. Это так, в большинстве случаев люди не знают, о чем им следует просить. В контексте исходного вопроса этот ответ является правильным. Теперь прекратите добавлять шум.
Марк Кан
420

Чтобы проверить на ноль, в частности, вы бы использовали это:

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;

WebWanderer
источник
9
Какова цель проверки типов, если вы используете ===строгое равенство? Спасибо. Также для теста NaN вы можете использовать isNaN(value)этот метод, который будет возвращать trueтолько если переменная равна NaN.
Михаил Малиновский,
16
Есть ли случай, когда variable === nullон не относится к типу "объект"? Если нет, то почему бы не упростить проверку variable === null, выбрасывая второй конъюнкт? Спасибо.
Унан Ростомян
7
@HunanRostomyan Хороший вопрос, и, честно говоря, нет, я не думаю, что есть. Скорее всего, вы достаточно безопасны, используя variable === nullкоторые я только что протестировал здесь, в этом JSFiddle . Я также использовал `&& typeof variable === 'object'` не только для того, чтобы проиллюстрировать интересный факт, что nullзначение является typeof object, но и для того, чтобы придерживаться последовательности других проверок. Но да, в заключение, вы можете безопасно использовать просто variable === null.
WebWanderer
1
jsfiddle.net/neoaptt/avt1cgem/1 Вот этот ответ разбит на функции. Не очень полезно, но я все равно это сделал.
Неоапт
1
Я собираюсь сделать что-то, что почти никогда не будет хорошей идеей: изменить код в этом ответе. В частности, удалите совершенно ненужный тест для объекта типа при проверке на ноль. Это фундаментальный фрагмент кода: не очень хорошая идея, чтобы хотя бы один новичок неправильно понял, что им нужно пройти этот подробный тест.
ToolmakerSteve
59

просто заменить ==с ===во всех местах.

== это свободное или абстрактное сравнение равенства

=== это строгое сравнение равенства

См. Статью MDN о сравнениях и сходстве равенства для более подробной информации.

ic3b3rg
источник
2
Это работает, только если вы считаете, undefinedчто нет null. В противном случае это приведет к неожиданному поведению. Обычно, если вас интересуют оба null/ undefinedно не ложные значения, используйте ==(один из немногих случаев, когда вы должны это сделать).
Андрей Мао
2
@AndrewMao undefined не является null : stackoverflow.com/a/5076962/753237
ic3b3rg
2
Я верю, что @AndrewMao действительно говорил. Его первое предложение может быть переписано: «Это работает только в ситуациях, когда undefined и null не являются практическими эквивалентами».
BobRodes
1
@BobRodes Спасибо за разъяснение моего плохого письма, я ценю это :)
Эндрю Мао
@ AndrewMao Добро пожаловать. И я бы не назвал ваше письмо плохим, лично; Я бы сказал, что это намного лучше, чем в среднем. :)
BobRodes
30

Оператор строгого равенства: -

Мы можем проверить ноль, ===

if ( value === null ){

}

Просто с помощью if

if( value ) {

}

будет иметь значение true, если значение не равно :

  • значение NULL
  • не определено
  • 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");
}

deekshith
источник
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
Не используйте try и catch для контроля потока. Это не хорошее решение.
Андрей С.
4

В JavaScript ни одна строка не равна null.

Возможно, вы ожидали, pass == nullчто будет true, когда passпустая строка, потому что вы знаете, что оператор свободного равенства ==выполняет определенные виды приведения типов.

Например, это выражение верно:

'' == 0

Напротив, оператор строгого равенства ===говорит, что это неверно:

'' === 0

Учитывая, что ''и 0они слабо равны, вы можете разумно предположить, что ''и nullони слабо равны. Однако это не так.

Это выражение ложно:

'' == null

Результатом сравнения любой строки nullявляется false. Поэтому pass == nullи все остальные ваши тесты всегда ложны, и пользователь никогда не получит оповещение.

Чтобы исправить ваш код, сравните каждое значение с пустой строкой:

pass === ''

Если вы уверены, что passэто строка, pass == ''она также будет работать, потому что только пустая строка свободно равна пустой строке. С другой стороны, некоторые эксперты говорят, что это хорошая практика - всегда использовать строгое равенство в JavaScript, если вы специально не хотите выполнять приведение типов, которое выполняет оператор свободного равенства.

Если вы хотите узнать, какие пары значений слабо равны, обратитесь к таблице «Сравнения одинаковости» в статье Mozilla на эту тему .

Майкл Ласло
источник
4

чтобы проверить наличие неопределенных и нулевых значений в 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, который кажется еще более запутанным / черный ящик, но все равно стоит отметить, потому что он использует преимущества 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и объект, мы можем обнаружить его как ноль.

Я сделал более сложную функцию. Nature of witch будет работать лучше, чем 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

Ashita.gupta
источник
0

Это не будет работать в случае логических значений, поступающих из БД для ex:

 value = false

 if(!value) {
   // it will change all false values to not available
   return "not available"
 }
Codiee
источник
0

AFAIK в JAVASCRIPT, когда переменная объявлена, но ей не присвоено значение, ее тип - undefined. поэтому мы можем проверить переменную, даже если она будет содержать objectнекоторый экземпляр вместо значения .

создайте вспомогательный метод для проверки возвращаемого значения null 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");
}
PS
источник
-1

Попробуй это:

if (!variable && typeof variable === "object") {
    // variable is null
}
user5520516
источник
null - единственное, что является «ложным», а typeof возвращает «объект».
user5520516
2
Как это лучше чем if (variable === null)? Также кто-то уже предоставил этот ответ в прошлом году: stackoverflow.com/a/27550756/218196 .
Феликс Клинг