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