Як перевірити, чи не є значенням значення null і чи не порожній рядок у JS


86

Чи є якась перевірка, чи не є значення в Nuvascript чи не порожнім рядком? Я використовую наступний:

var data; //get its value from db 
if(data != null && data != '') {
   // do something
}

Але мені цікаво, чи є інше краще рішення. Дякую.


6
if(data)цього вистачило б, як тут
CIsForCookies

1
Я спробував це, але в одному з двох випадків це не спрацювало.
ivva

дякую всім, я спробую це. Сподіваюся, це спрацює.
ivva

undefinedце один із особливих випадків, який, згідно з вашою логікою, повинен викликати, // do somethingале не буде.
Салман,

Відповіді:


163

Якщо ви справді хочете підтвердити, що змінна не є нульовою і не є порожнім рядком, ви повинні написати:

if(data !== null && data !== '') {
   // do something
}

Зверніть увагу, що я змінив ваш код для перевірки на рівність типу ( !==| ===).

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

if (data) {
  // do something
}

Оскільки в javascript як нульові значення, так і порожні рядки дорівнює false (тобто null == false).

Різниця між цими двома частинами коду полягає в тому, що для першої кожне значення, яке не є спеціально нульовим або порожнім рядком, буде входити в if. Але, на другому, кожен істинний іш значення введіть if: false, 0, null, undefinedі порожні рядки, не буде.


2
0 є розумним значенням у багатьох випадках
Aequitas

3
тому слово розумне обгорнуте цитатами :)
Гершон Папі,

@Adam Якщо цього не сталося, ви можете просто залишити це поле порожнім і використати інше. Це завжди буде інвертувати, як очікувалося.
Нейт

Це не повинні бути дані! == null || data! == '' замість використання &&?
Імдад

@Imdad ОП попросив перевірити, чи не є значення нульовим І не порожнім рядком, тому ні.
Гершон Папі

18

І те, nullі порожній рядок є хибними значеннями в JS. Отже,

if (data) { ... }

цілком достатньо.

Примітка збоку, хоча: я б уникав наявності змінної в моєму коді, яка може проявлятися в різних типах. Якщо дані в кінцевому підсумку будуть рядком, тоді я спочатку визначив би свою змінну порожнім рядком, тож ви можете зробити це:

if (data !== '') { ... }

без нуля (або будь-якої дивної речі, подібної data = "0") не заважає.


11

Замість використання

if(data !== null && data !== ''  && data!==undefined) {

// do something
}

Ви можете використовувати нижче простий код

if(Boolean(value)){ 
// do something 
}
  • Значення, які інтуїтивно “порожні”, як 0, порожній рядок, null, undefined та NaN, стають хибними
  • Інші цінності стають істинними

6

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

if(!(!data || data.trim().length === 0)) {
  // do something here
}

Якщо у вас є рядок, що складається з одного або декількох порожніх пробілів, він буде оцінений як істинний.


4
if (data?.trim().length > 0) {
   //use data
}

?. по бажанню оператор ланцюжка буде коротке замикання і повернення , undefinedякщо дані nullish( nullабо undefined) , які будуть оцінювати до помилкового в ifвираженні.


Я чесно не знав про цей оператор .. на жаль, деякі браузери Android не підтримують його, але в іншому випадку підтримка досить гарна!
brandonmack

2

Як нульовий, так і порожній можуть бути перевірені наступним чином:

<script>
function getName(){
    var myname = document.getElementById("Name").value;
    if(myname != '' && myname != null){
        alert("My name is "+myname);
    }else{
        alert("Please Enter Your Name");
    }       
}


1

спробуйте ----------

function myFun(){
var inputVal=document.getElementById("inputId").value;
if(inputVal){
document.getElementById("result").innerHTML="<span style='color:green'>The value is "+inputVal+'</span>';
}
else{
document.getElementById("result").innerHTML="<span style='color:red'>Something error happen! the input May be empty.</span>";
}
}
<input type="text" id="inputId">
<input type="button" onclick="myFun()" value="View Result">
<h1 id="result"></h1>


1

Коли ми кодуємо порожнім, по суті, це може означати будь-яку з наступних ситуацій, враховуючи обставини;

  • 0 як значення числа
  • 0,0 як у плаваючому значенні
  • '0' як у рядковому значенні
  • '0.0' як у рядковому значенні
  • null, як у Null value, за шансом він також може захопити undefined або може не
  • undefined як у невизначеному значенні
  • false як у хибному істинному значенні, за шансом 0 також як істинний, але що, якщо ми хочемо вловити false, як воно є
  • '' порожнє значення жала без пробілу чи вкладки
  • '' рядок із пробілом або лише табуляцією

У реальній життєвій ситуації, як зазначив ОП, ми можемо побажати протестувати їх усіх, або часом ми можемо побажати лише тестувати обмежений набір умов.

Як правило, if(!a){return true;}більшу частину часу виконує своє призначення, однак він не охоплює ширший набір умов.

Ще один хак, який зробив свій виток, - це return (!value || value == undefined || value == "" || value.length == 0);

Але що, якщо нам потрібен контроль над усім процесом?

У нативному ядрі JavaScript немає простого рішення, що його потрібно прийняти. Враховуючи те, що ми відмовляємось від підтримки застарілого IE11 (чесно кажучи, навіть у Windows це має бути), нижченаведене рішення, що з’явилося через розлад, працює у всіх сучасних браузерах;

 function empty (a,b=[])
 {if(!Array.isArray(b)) return; 
 var conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
 if(conditions.includes(a)|| (typeof a === 'string' && conditions.includes(a.toString().trim())))
 {return true;};
 return false;};`

Логіка рішення - це функція має два параметри a і b , a - це значення, яке нам потрібно перевірити, b - масив із заданими умовами, які нам потрібно виключити із попередньо визначених умов, перерахованих вище. Значенням за замовчуванням b встановлено порожній масив [].

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

наступним кроком є ​​обчислення різниці масивів з [null,'0','0.0',false,undefined,'']і з масиву b. якщо b - порожній масив, будуть визначені заздалегідь визначені умови, інакше він видалить відповідні значення.

условия = [заздалегідь визначений набір] - [для виключення набір] функція фільтра виконує саме те, що використовує його. Тепер, коли у нас є умови в наборі масивів, все, що нам потрібно зробити, це перевірити, чи є значення в масиві умов. включає функцію робить саме те, що немає необхідності писати неприємні цикли вашого власного нехай двигуна JS робити важкий підйом.

Зрозуміло, якщо ми хочемо перетворити a у рядок для порівняння, тоді 0 та 0.0 будуть працювати нормально, однак Null та Undefined би через помилку блокуючи весь сценарій. Нам потрібне рішення крайнього випадку. Знизу простий || охоплює крайній випадок, якщо перша умова не виконується. Запуск чергової ранньої перевірки включення робить достроковий вихід, якщо не виконано.

if(conditions.includes(a)||  (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))

Функція trim () охоплює лише великі пробіли та значення вкладок, і це буде діяти лише у краєвому випадку.

Ігрова площадка

function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)|| 
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
 return true;
} 
return false;
}

console.log('1 '+empty());
console.log('2 '+empty(''));
console.log('3 '+empty('      '));
console.log('4 '+empty(0));
console.log('5 '+empty('0'));
console.log('6 '+empty(0.0));
console.log('7 '+empty('0.0'));
console.log('8 '+empty(false));
console.log('9 '+empty(null));
console.log('10 '+empty(null,[null]));
console.log('11 dont check 0 as number '+empty(0,['0']));
console.log('12 dont check 0 as string '+empty('0',['0']));
console.log('13 as number for false as value'+empty(false,[false]));

Давайте зробимо це складним - а що, якщо наше значення для порівняння - це масив його сам і може бути настільки глибоко вкладеним, наскільки це може бути. що, якщо ми хочемо перевірити, чи не є значення в масиві порожнім, це може бути крайній бізнес-випадок.

function empty (a,b=[]){
    if(!Array.isArray(b)) return;

    conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
    if(Array.isArray(a) && a.length > 0){
    for (i = 0; i < a.length; i++) { if (empty(a[i],b))return true;} 
    } 
    
    if(conditions.includes(a)|| 
    (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
     return true;
    } 
    return false;
    }

console.log('checking for all values '+empty([1,[0]]));
console.log('excluding for 0 from condition '+empty([1,[0]], ['0']));

це проста і ширша функція використання, яку я застосував у своїй структурі;

  • Дає контроль над тим, що саме є визначенням порожнього в певній ситуації
  • Дає контроль за перевизначенням умов порожнього
  • Можна порівняти майже для кожної речі з рядків, числа, плаваючого, неправдивого, нульового, невизначеного та глибокого масивів
  • Рішення розробляється з урахуванням стабільності та гнучкості. Усі інші відповіді підходять на випадок, якщо потрібно розглянути простий або два випадки. Однак завжди є випадок, коли визначення порожніх змін під час кодування наведених фрагментів змушує працювати бездоганно в цьому випадку.

0

Мені настільки набридло перевіряти наявність нульових і порожніх рядків, що я зараз просто просто пишу і викликаю невелику функцію, яка робить це за мене.

/**
 * Test if the given value equals null or the empty string.
 * 
 * @param {string} value
**/
const isEmpty = (value) => value === null || value === '';

// Test:
isEmpty('');        // true
isEmpty(null);      // true
isEmpty(1);         // false
isEmpty(0);         // false
isEmpty(undefined); // false

0

function validateAttrs(arg1, arg2, arg3,arg4){
    var args = Object.values(arguments);
    return (args.filter(x=> x===null || !x)).length<=0
}
console.log(validateAttrs('1',2, 3, 4));
console.log(validateAttrs('1',2, 3, null));
console.log(validateAttrs('1',undefined, 3, 4));
console.log(validateAttrs('1',2, '', 4));
console.log(validateAttrs('1',2, 3, null));

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