В javascript, всегда ли пустая строка в качестве логического значения false? - PullRequest
119 голосов
/ 01 января 2012

в JavaScript,

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

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

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

Ответы [ 5 ]

167 голосов
/ 01 января 2012

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

ToBoolean

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

52 голосов
/ 01 января 2012

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

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

9 голосов
/ 13 марта 2017

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 ), а затем он внутренне применяется ===. Но когда вы используете === напрямую, типы не конвертируются, поэтому сравнение строки с логическим значением всегда 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
8 голосов
/ 01 января 2012

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

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

5 голосов
/ 01 января 2012

Примерами выражений, которые могут быть преобразованы в ложные, являются выражения с нулевым значением, 0, пустой строкой ("") или неопределенным.(см. MDN Reference )

...