проверка javascript на ненулевой

134

Ниже приведен фрагмент кода, из которого мы получаем значение формы. Перед дальнейшей обработкой проверьте, не является ли значение нулевым.

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) почему-то он не работал с кавычками
Ананда
Мистер x в вопросе, null было как строка ... ваш случай, вероятно, другой
Арсен Мкртчян
146

это поможет вам

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}
144390
источник
22
хотя технически это работает, двойное не (!!) - это программная ошибка. Это действительно эквивалент if(val), который гораздо понятнее читать. Я бы придерживался этого (fyi Ujwal, !! val технически также должен работать на C или C ++) см. Здесь для значений «правдивости» javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck
2
как насчет if (! Boolean (val))
thedjaney 01
1
!! - это просто двойное отрицание, поэтому он буквально говорит, если (val.exists). Хотя мне все еще нравится, как это выглядит!
Kurai Bankusu
12
это будет ошибкой , если val = 0так !!0соответствует значению ЛОЖЬ
punkrockpolly
3
Это не просто двойной негатив. Это трансформирующий двойной негатив. Вы в основном преобразуете переменную в логическое значение. Там очень много говорить на эту тему , но достаточно сказать , что в тех случаях , когда ваш переменный 0, false, null, undefinedили некоторые такие значения , которые ПОСТАНОВЛЯЮТ trueс одним!, Вы собираетесь получить falseза !!. Его следует использовать с осторожностью, если вообще.
Гай Пасси,
84

Есть 3 способа проверить "не нуль". Я рекомендую использовать Strict Not Version.

1. Строгая не версия

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

Версия Strict Not использует "алгоритм сравнения строгого равенства" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . Он !==имеет более высокую производительность, чем !=оператор, поскольку алгоритм сравнения строгого равенства не выполняет приведение типов значений.

2. Нестрогий вариант Not Version

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

В нестрогой версии используется «алгоритм сравнения абстрактного равенства» http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . Производительность оператора !=ниже, чем у !==оператора, поскольку алгоритм сравнения абстрактного равенства приводит значения типов.

3. Версия Double Not

if (!!val) { ... }

Версия Double Not !!имеет более высокую производительность, чем версия Strict Not и Версия !==Non-Strict 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прямо не указано.

tfmontague
источник
Это очень странно. !!valработал у меня, но val!==nullне работал . Почему это?
TheLogicGuy 02
@TheLogicGuy - Что это за тип данных val? console.log(typeof val),
tfmontague
число. код удаляет "плохие" значения из массива (null, 0 и т. д.). Вот код: pastebin.com/L7Z1BtuL
TheLogicGuy 06
1
@TheLogicGuy - Ваша настоящая проблема не имеет ничего общего с null. NaN не фильтрует правильно - это всегда будет возвращать истину. Это должно работать:! (IsNaN (val) && (typeof val! == "undefined")). В Javascript есть такие понятия, как «Истина» и «Ложь». Оператор double-not !!удалит больше, чем просто null. Он также преобразует NaNи undefinedв ложь. Вот почему ваш массив правильно фильтрует при использовании двойного оператора not !!.
tfmontague 06
30

Использование !==as !=приведет вас в мир странностей с нетранзитивной таблицей истинности JavaScript.

Plynx
источник
Если вы не хотите специально проверять undefinedили null. В этом случае val != nullбудет возвращаться trueк undefinedили , nullно не для других значений falsey как 0.
Eric H
8

Вы должны использовать not equalsоператор строгого сравнения, !==чтобы при вводе пользователем "null"вы не попали в else.

бородавчатый
источник
1
Сьюзан
Налл не
5

Возможно, потому, что значение valфактически является строкой, "null"а не значением null.

ScottyUCSD
источник
3

Это должно работать нормально ..

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }
vkGunasekaran
источник
2

Если вы хотите включить 0 как допустимое значение:

if (!!val || val === 0) { ... }
punkrockpolly
источник
1

Это будет работать:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}
MoH
источник