javascript перевірити не null


133

Нижче - фрагмент коду, де ми отримуємо значення форми. Перед подальшою обробкою перевірте, чи значення не є нульовим.

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

Будь-які ідеї, чому так буває .. ??


2
CW стався тому, що 6+ користувачів редагували питання.
ВИ

! == замість! =
GetBackerZ

Відповіді:


78

Це тому, що val не є null, але містить 'null'як рядок.

Спробуйте позначити "null"

if ('null' != val)

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


2
має бути, якщо (null! = val) якось не працювало з цитатами
Ananda

Mr.x у питанні, null був таким же строковим ... ваш випадок, мабуть, інший
Арсен Мкртчян

145

це зробить трюк для вас

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
в той час як технічно це працює, подвійний не (!!) - це програмний факс. Це дійсно еквівалент if(val), який читати набагато зрозуміліше. Я б дотримувався цього (fyi Ujwal, !! val також повинен технічно працювати на C або C ++). Тут дивіться значення "правдивості" javasch
Буде Бак

2
як щодо if (! Boolean (val))
thedjaney

1
!! це лише подвійний мінус, тому це буквально говорить якщо (val.exists). Мені все одно подобається те, як це виглядає!
Kurai Bankusu

12
це не вдасться, якщо val = 0оскільки !!0оцінюється на false
punkrockpolly

3
Це не простий подвійний негатив. Це перетворюючий подвійний негатив. Ви в основному перетворюєте змінну в булеву. Там дуже багато говорити на цю тему , але досить сказати , що в тих випадках , коли ваш змінний 0, false, null, undefinedабо деякі такі значення , які постановляють trueз одним !, Ви збираєтеся отримати falseза !!. Її слід використовувати економно, якщо вона взагалі є.
Хлопець Пассі

83

Існує 3 способи перевірки на "ненуле". Моя рекомендація - використовувати строгу не версію.

1. Сувора не версія

if (val !== null) { ... }

Версія суворої не використовує "Алгоритм порівняння рівності" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . Більш !==швидка продуктивність, ніж !=оператор, оскільки алгоритм суворого порівняння рівності не вводить значення.

2. Не строга не версія

if (val != 'null') { ... }

У не строгій версії використовується "Алгоритм порівняння рівних рівностей" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . !=Має меншу продуктивність, ніж !==оператор , так як абстрактний алгоритм порівняння рівності значень приведення типів.

3. Подвійна не версія

if (!!val) { ... }

Версія Double Not !!має більш високу продуктивність, ніж як версія Strict Not, так !==і не строга версія Not !=( https://jsperf.com/tfm-not-null/6 ). Однак, це типаж значення «Falsey» , як undefinedі NaNв False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) , що може призвести до несподіваних результатів, і вона гірше , тому що читаність nullне вказано прямо.


Це дуже дивно. !!valпрацював на мене, але val!==nullне мав. Чому це?
TheLogicGuy

@TheLogicGuy - що таке тип даних val? console.log(typeof val).
tfmontague

число. код видаляє "погані" значення з масиву (null, 0 і т.д.). Ось код: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - Ваша реальна проблема не має нічого спільного з null. NaN неправильно фільтрує - це завжди повернеться істиною. Це має спрацювати:! (IsNaN (val) && (typeof val! == "undefined")). У Javascript є поняття, відоме як "Truthy" та "Falsey". Оператор Double-Not !!видалить більше, ніж просто null. Це перетвориться NaNі undefinedв помилкове. І тому ваш масив правильно фільтрується при використанні подвійного не-оператора !!.
tfmontague

30

Використовуйте, !==як !=ви ввійдете у світ нетрадиційного дивацтва таблиці істинності JavaScript.


Якщо ви не хочете спеціально перевірити наявність undefinedабо null. У цьому випадку val != nullбуде повертатися trueдо undefinedабо , nullале не для інших значень falsey як 0.
Ерік Н

8

Ви повинні використовувати суворий not equalsоператор порівняння, !==щоб, якщо користувач вводить дані, "null"ви не отримаєте до else.


1
Сьюзен Нулл не була б рада, якби її ім'я не було прийнято у формі введення даних lol
Andez

5

Це можливо тому, що значення valнасправді є рядком, "null"а не значенням null.


3

Це має добре працювати ..

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }

2

Якщо ви хочете мати можливість включити 0 як дійсне значення:

if (!!val || val === 0) { ... }


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