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
falseздесь: jsfiddle.net/8CKbd