Ложные значения против нулевой, неопределенной или пустой строки

11

Я работал с JQuery на протяжении многих лет. Однако в последнее время я все глубже изучаю язык JavaScript. Недавно я услышал о «истинных» и ложных ценностях. Однако я не до конца их понимаю. В настоящее время у меня есть код, который выглядит следующим образом:

var fields = options.fields || ['id', 'query'];

Мне нужно определить, является ли поле пустым, неопределенным или имеет длину 0. Я знаю, что долгий путь это сделать:

if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
 ...                    
}

Мой вопрос заключается в следующем:

if (!fields)  {
 ...
}
user687554
источник
4
Хорошо смотри сюда.
Роберт Харви

Ответы:

23

В программировании правдивость или ложность - это то качество тех логических выражений, которые не преобразуются в фактическое логическое значение, но которые, тем не менее, интерпретируются как логический результат.

В случае C любое выражение с нулевым значением интерпретируется как ложное. В Javascript выражение valueв

if(value) {
}

будет оцениваться как true, если valueнет:

null
undefined
NaN
empty string ("")
0
false

См. Также
Существует ли стандартная функция для проверки нулевых, неопределенных или пустых переменных в JavaScript?

Роберт Харви
источник
9

Набор значений "truey" и "falsey" в JavaScript происходит от ToBooleanабстрактной операции, определенной в спецификации ECMAScript , которая используется при приведении значения к логическому:

+--------------------------------------------------------------------------+
| Argument Type | Result                                                   |
|---------------+----------------------------------------------------------|
| Undefined     | false                                                    |
|---------------+----------------------------------------------------------|
| Null          | false                                                    |
|---------------+----------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion).    |
|---------------+----------------------------------------------------------|
| Number        | The result is false if the argument is +0, 0, or NaN;   |
|               | otherwise the result is true.                            |
|---------------+----------------------------------------------------------|
| String        | The result is false if the argument is the empty String  |
|               | (its length is zero); otherwise the result is true.      |
|---------------+----------------------------------------------------------|
| Object        | true                                                     |
+--------------------------------------------------------------------------+

Из этой таблицы мы можем видеть это nullи undefinedоба приводятся falseв логическом контексте. Тем fields.length === 0не менее, ваш обычно не отображается на ложное значение. Если fields.lengthэто строка, то она будет обрабатываться как false(потому что строка нулевой длины false), но если это объект (включая массив), он будет приведен к true.

Если fieldsдолжна быть строка, то !fieldsдостаточно предиката. Если fieldsэто массив, ваша лучшая проверка может быть:

if (!fields || fields.length === 0)
apsillers
источник
2

Короткий ответ:

Нет , они не одинаковы.

Но это:

if (!fields) { ... }

Это так же, как это:

if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}

Длинный (и лучший) ответ:

Давайте сначала поговорим о правдивых и ложных ценностях.

Это все о том, что происходит, когда вы оцениваете что-то как логическое значение. В JavaScript это происходит, когда вы используете такие вещи, как ifоператоры; Логические операторы любят ||, !или &&; или Boolean()функция.

Boolean()Функция принимает значение и возвращает либо trueили false.

Например:

var age = 1; // Let's evaluate age as a boolean Boolean(age); // true

Попробуйте и попробуйте это в узле repl.

Логическое значение может быть только trueили false, поэтому возвращаемое значение Boolean() должно быть либо либо, trueлибо false. В этом случае мы передали значение 1, и при оценке как логическое значение 1равно true.

Важное замечание: При оценке как логического значения значение должно быть либо истинным, либо ложным. Это только два варианта.

В JavaScript есть только 6 ложных значений. Значения, которые будут falseпри оценке как логические. Они являются: false, 0, "", null, undefined, и NaN. Поэтому, если любое из этих значений будет оценено как логическое, они будут ложными:

Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false

Это означает, что любое другое значение в JavaScript будет trueоцениваться как логическое значение. Таким образом, все остальные значения в JavaScript правдивы.

Другой простой способ оценить что-либо как booleanесть с помощью !оператора. Как и Booleanфункция, она оценивает значение как логическое значение. Но истинные ценности становятся falseи ложные становятся true.

!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true

Опять же, попробуйте это в узле repl или что-то, чтобы убедиться, что вы понимаете.

Итак, это утверждение:

if (!fields) { ... }

Говорит следующее: «если fields, когда вычисляется как логическое значение, ложно, тогда запустите код внутри этого оператора if».

Что касается вашего первого заявления:

var fields = options.fields || ['id', 'query'];

Вы работаете с логическим оператором ИЛИ, о котором стоит прочитать, чтобы убедиться, что вы понимаете. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

Сэм
источник
0

Ваш код означает:

var fields;
if (options.fields)
    fields = options.fields;
else
    fields = ['id', 'query'];

Теперь options.fieldsпреобразуется в логическое значение. По определению null, undefined, 0, ""преобразуется в false, ( в основном) все остальное превращается в true(но я не хочу быть настолько точным).

Это не значит то же самое, потому что fields.length === 0линия. Пустые массивы и другие объекты преобразуются в true.

примечание: Javascript иногда является большим беспорядком ... Например, нет необходимости в двух операторах проверки типов (typeof и instanceof). Это просто сбивает с толку ppl, когда true instanceof Booleanне работает, и использование typeof(true) == "boolean"склонно к ошибкам из-за ввода строки без автозаполнения. Возможно, в некоторых новых версиях эти проблемы будут решены.

inf3rno
источник
-1

Вы можете попробовать (!! fields), если элемент fields имеет значение null, undefined или имеет длину 0, он вернул бы true. Или (!!! поля), тогда это вернет true.

двойной! или !! заставит истину или ложь. Хотел бы я найти хорошее определение для этого, но я не могу найти его снова.

Рэнди Коллиер
источник
1
"!!!" такой же как "!" по определению, как и "!!!!!" а также "!!!!!!!". «Отметить» значение можно использовать для подтверждения того, что что-то является правдой или ложью, что, безусловно, имеет свое место, но не полностью отвечает на вопрос ОП. То есть, что именно являются истинными или ложными ценностями?
Джеффри Суини
Я нашел статью, которая лучше описывает оператор not not: bennadel.com/blog/… developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Это превратит ваше условие в логическое значение.
Рэнди Коллиер