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 намагається перетворити їх у Numbers відповідно до їх значення ( використовуючи операції стандартних викликів ToNumber і ToPrimitive ), а потім застосовується внутрішньо ===
. Але коли ти користуєшся===
прямому типи не перетворюються, тому порівнювати рядок з булевим завжди false
.
Грубо кажучи, тест JavaScript conditionals ( 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