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