В javascript всегда ли пустая строка ложна как логическое значение?

134

в javascript,

var a = '';
var b = (a) ? true : false;

var bбудет установлен в false.

это определенное поведение, на которое можно положиться?

cc молодой
источник
Вы уверены, что я falseздесь: jsfiddle.net/8CKbd
анубхава 01
Я сделал еще один шаг вперед. Строка с пробелами верна. if ('') {console.log ('!')}, но '' == 0 истинно.
Азат
2
Я думаю, что издание @JonH неверно, пустая строка ''оценивается как false в логическом контексте, поэтому if a = '';then a ? false : true=> '' ? false : true=> false ? false : true=> true(потому что это оценка для ложного значения). Я думаю, что var b = (a) ? true : false;следующее утверждение должно быть правильным.
PhoneixS
@PhoneixS отредактировал, надеюсь, теперь это более значимо.
SwissCoder
1
@SwissCoder не то, что не читается, но выводит другой ответ. Сейчас исправил.
PhoneixS

Ответы:

191

Да. Javascript - это диалект ECMAScript, и спецификация языка ECMAScript четко определяет это поведение:

ToBoolean

Результат будет ложным, если аргумент - пустая строка (ее длина равна нулю); в противном случае результат верный

Цитата взята из http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Arenielle
источник
Аааа и все решено
Энтони
28
Одно предостережение - это new String("")правда! Это потому, что это объект, тогда как краткая форма ""представляет версию с примитивным значением. То же касается new Number(0)и даже new Boolean(false). Это веская причина не использовать версии объекта в вашем коде, и это означает, что он if (str.length)обрабатывает этот крайний случай, тогда как if (str)не будет.
Крис Миддлтон
54

Да. Все false, 0пустые строки ''и "", NaN, undefined, и nullвсегда оценивается как false; все остальное есть true.

И в вашем примере b falseпосле оценки. (Думаю, вы ошибочно написали true)

Хоссейн
источник
2
nullне false, ни true, nullне null. jsfiddle.net/sq1Lkpg0
Бруно Фингер,
7
@Bruno, можно провести такой же тест с NaNи undefined. Это не так, falseно они лживы. Об этом и спросили.
Джозеф
11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var bбудет установлено значение true.

это определенное поведение, на которое можно положиться?

Как ответил выше, да , то есть определяется поведение пустой строкой в условноеifвыражении ||, &&, ? :, ...). (В стандарте говорится, что должна применяться внутренняя операция ToBoolean .)

Оценка отличается, когда в сравнении используется пустая строка (см. Истина, Равенство и JavaScript ), хотя результаты в основном одинаковы :

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

Объяснение: По существу, когда операнды ==имеют разные типы, JavaScript старается изо всех сил , чтобы преобразовать их в числа, в зависимости от их стоимости ( с использованием ОПЕРАЦИЙ стандартные вызовы ToNumber и ToPrimitive ), а затем он применяется внутренне ===. Но при ===прямом использовании типы не преобразуются, поэтому всегда можно сравнивать String с Boolean false.

Грубо говоря, условные выражения JavaScript ( ToBoolean ) проверяют определенное, ненулевое, ненулевое, непустое, ненулевое значение (пустая строка ... пуста, числа -0 или +0 ... ноль, NaN не определенное число, но пустой объект, по- видимому , не очень пустой), или , как мне нравится думать, условный тест для а (истинных) вещей , в то время как ==сравнивает кажущиеся, тщательно преобразованные значения ( ToPrimitive , ToNumber ) из его операнды и ===ищет точное совпадение .

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

Есть больше примеров в Истине, Равенстве и JavaScript, где это различие действительно имеет значение, например '0', trueв условном (ненулевая длина, или, это вещь ), но falseв ==сравнении ( значение равно нулю). '1'опять же, есть trueв обоих случаях (это вещь и имеет ненулевое значение).

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true

Orafu
источник
1
Сначала я подумал: «Пшш, это уже перебор, на это уже хорошо ответили». Но это было хорошо представлено и информативно. Спасибо.
Marc L.
8

var bбудет установлен в true. Это связано с тем, что пустая строка считается значением «ложь» в JavaScript, как и некоторые другие значения.

Пожалуйста, посмотрите http://www.sitepoint.com/javascript-truthy-falsy/ на предмет ложных значений.

Джонатон Болстер
источник
Вы ошиблись в своем ответе. var bна самом деле будет установлено значение, trueпотому что это противоположно тому, var aесли вы посмотрите на код.
bombek
@bombek Спасибо, буду обновлять. Похоже, исходный вопрос был отредактирован после моего ответа (значения поменялись местами)
Джонатон Болстер
5

Примеры выражений, которые могут быть преобразованы в false, - это выражения, которые оцениваются как null, 0, пустая строка ("") или undefined. (см. ссылку MDN )

Марсель Джекверт
источник