Чи завжди у порожньому рядку помилкова помилка як булева?


134

у javascript,

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

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

це визначена поведінка, на яку можна покластися?


Ви впевнені, я потрапляю falseсюди: jsfiddle.net/8CKbd
anubhava

Я зробив це на крок далі. Рядок з пробілами - це правда. if ('') {console.log ('!')}, але '' == 0 вірно.
Азат

2
Я думаю, що видання @JonH невірно, порожній рядок ''оцінюється як false в булевому контексті, тому якщо a = '';тоді a ? false : true=> '' ? false : true=> false ? false : true=> true(тому що це оцінка для помилкового значення). Я думаю, що це має var b = (a) ? true : false;бути правильно з наступним твердженням.
PhoneixS

@PhoneixS відредаговано, сподіваюсь, зараз це більш змістовно.
SwissCoder

1
@SwissCoder - це не те, що він не читабельний, але він дає іншу відповідь. Тепер я це виправив.
PhoneixS

Відповіді:


191

Так. Javascript - це діалект ECMAScript, а специфікація мови ECMAScript чітко визначає таку поведінку:

ToBoolean

Результат помилковий, якщо аргументом є порожній рядок (його довжина дорівнює нулю); інакше результат правдивий

Цитата взята з http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


Аааа і це врегульовано
Ентоні

28
Одне застереження - new String("")це правда! Це тому, що це об'єкт, тоді як коротка форма ""являє собою версію примітивного значення. Те саме стосується new Number(0)і рівномірного new Boolean(false). Це вагомий привід не використовувати об’єктні версії у вашому коді, і це означає, що if (str.length)обробляє цей крайовий регістр, тоді як if (str)не буде.
Кріс Міддлтон

54

Так. Все false, 0порожні рядки ''і "", NaN, undefined, і nullзавжди оцінюється як false; все інше є true.

І у вашому прикладі b - falseпісля оцінки. (Я думаю, ви помилково написали true)


2
nullНЕ false, ні true, nullНЕ null. jsfiddle.net/sq1Lkpg0
Бруно Фінгер

7
@Bruno, Ви можете виконати те саме тестування з NaNі undefined. Вони не є, falseале вони хибні. Про що запитали.
Йосиф

11

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


1
Спочатку я подумав: "pssh, це надмірно, це вже добре відповіли". Але це було добре представлене та інформативне. Дякую.
Марк Л.

8

var b буде встановлено на true . Це тому, що порожня рядок у JavaScript вважається значенням "фальси", як і деякі інші значення.

Перегляньте http://www.sitepoint.com/javascript-truthy-falsy/ для фальшивих значень


Ви неправі у своїй відповіді. var bнасправді буде встановлено, trueтому що це навпаки, var aякщо ви подивитеся на код.
bombek

@bombek Спасибі - я приєднаюсь. Схоже, оригінальне запитання було відредаговано після моєї відповіді (значення були замінені навколо)
Jonathon

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.