Неправильні значення проти нуля, невизначеного або порожнього рядка


11

Я працював з jQuery протягом багатьох років. Однак останнім часом я опинився все глибше в мові JavaScript. Останнім часом я чув про цінності "truthy" та фальси. Однак я їх не повністю розумію. Наразі у мене є такий код, який виглядає приблизно так:

var fields = options.fields || ['id', 'query'];

Мені потрібно визначити, чи поля є недійсними, невизначеними чи мають довжину 0. Я знаю, що довгий шлях:

if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
 ...                    
}

Моє запитання: чи таке саме:

if (!fields)  {
 ...
}

Відповіді:


23

У програмуванні правдивість або хибність полягає в тій якості тих булевих виразів, які не відповідають фактичному булевому значенню, але все-таки трактуються як булевий результат.

У випадку з C будь-який вираз, який дорівнює нулю, трактується як помилковий. У Javascript вираз valueв

if(value) {
}

оцінюється як вірно, якщо valueні:

null
undefined
NaN
empty string ("")
0
false

Дивіться також
Чи існує стандартна функція перевірки нульових, невизначених чи порожніх змінних у JavaScript?


9

Набір значень "truthy" та "falsey" у JavaScript походить від ToBooleanабстрактної операції, визначеної у специфікації ECMAScript , яка використовується при примусовому значенні на булеве:

+--------------------------------------------------------------------------+
| Argument Type | Result                                                   |
|---------------+----------------------------------------------------------|
| Undefined     | false                                                    |
|---------------+----------------------------------------------------------|
| Null          | false                                                    |
|---------------+----------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion).    |
|---------------+----------------------------------------------------------|
| Number        | The result is false if the argument is +0, 0, or NaN;   |
|               | otherwise the result is true.                            |
|---------------+----------------------------------------------------------|
| String        | The result is false if the argument is the empty String  |
|               | (its length is zero); otherwise the result is true.      |
|---------------+----------------------------------------------------------|
| Object        | true                                                     |
+--------------------------------------------------------------------------+

З цієї таблиці ми можемо бачити це nullі undefinedобидва примушені до falseбулевого контексту. Однак ваш файл fields.length === 0зазвичай не відображається на хибному значенні. Якщо fields.lengthце рядок, то він буде розглядатися як false(тому що нульовий рядок є false), але якщо це об'єкт (включаючи масив), він буде примусовий до true.

Якщо fieldsмає бути рядок, то !fieldsце достатній присудок. Якщо fieldsце масив, найкраща перевірка може бути:

if (!fields || fields.length === 0)

2

Коротка відповідь:

Ні , вони не однакові.

Але це:

if (!fields) { ... }

Це те саме, що і це:

if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}

Довга (і краща) відповідь:

Давайте спочатку поговоримо про правдиві та хибні цінності.

Вся справа в тому, що відбувається, коли ти оцінюєш щось як булеве. У JavaScript це відбувається, коли ви використовуєте такі речі, як ifзаяви; Логічні оператори люблять ||, !або &&; або Boolean()функція.

Boolean()Функція приймає значення і повертає або trueабо false.

Наприклад:

var age = 1; // Let's evaluate age as a boolean Boolean(age); // true

Вперед і спробуйте це у відтворенні вузла.

Булевим може бути лише trueабо false, тому повернене значення Boolean() має бути trueабо false. У цьому випадку ми передали значення 1, а коли оцінюємо як булеве значення, 1є true.

Важливо: Якщо оцінюється як булева, значення має бути істинним, або хибним. Це єдині два варіанти.

У JavaScript є лише 6 фальшивих значень. Значення, які будуть falseоцінені як булеві. Вони є: false, 0, "", null, undefined, і NaN. Отже, якщо будь-яке з цих значень оцінюється як булеве, воно буде помилковим:

Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false

Це означає, що будь-яке інше значення в JavaScript буде trueоцінено як булеве. Отже, будь-яке інше значення в JavaScript є правдоподібним.

Ще один простий спосіб оцінити щось як a boolean- це за допомогою !оператора. Так само, як і Booleanфункція, це оцінює значення як булеве. Але ціннісні цінності стають falseі хибними значеннями стають true.

!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true

Знову ж таки, спробуйте це у відтворенні вузла чи щось, щоб переконатися, що ви розумієте.

Отже, це твердження:

if (!fields) { ... }

Каже наступне: "якщо fields, коли оцінюється як булева, помилкова, тоді запустіть код всередині цього оператора if".

Що стосується вашого першого твердження:

var fields = options.fields || ['id', 'query'];

Ви працюєте з логічним оператором АБО, про який варто прочитати, щоб переконатися, що ви розумієте. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators


0

Ваш код означає:

var fields;
if (options.fields)
    fields = options.fields;
else
    fields = ['id', 'query'];

Тепер options.fieldsперетворюється на булеве значення. За визначенням null, undefined, 0, ""перетворюється в false, ( в основному) все інше перетворюється в true(але я не хочу бути настільки точним).

Це не означає те саме, бо fields.length === 0рядок. Порожні масиви та інші об'єкти перетворюються в true.

Примітка: Javascript іноді є великим безладом ... Наприклад, немає реальної потреби в операторах перевірки двох типів (typeof та instanceof). Він просто плутає ppl, коли true instanceof Booleanвін не працює, а використання typeof(true) == "boolean"схильне до помилок через введення рядка без автоматичного завершення. Можливо, в деяких нових версіях ці проблеми будуть вирішені.


-1

Ви можете спробувати (!! поля), якщо елемент поля недійсний, невизначений або має довжину 0, то він повернеться істинним. Або (!!! поля) тоді це повернеться правдою.

подвійний! або !! змусить істинно чи помилково. Я б хотів, щоб я міг знайти для цього гарне визначення, але, здається, не зможу знайти його знову.


1
"!!!" те саме, що "!" за визначенням, як це "!!!!!" і "!!!!!!!". Значення "Notting" може бути використане для підтвердження того, що щось є неправдивим або хибним, що, безумовно, має своє місце, але воно не відповідає повністю на питання ОП. Тобто, що конкретно є фальшивими чи хибними значеннями?
Jeffrey Sweeney

Я знайшов статтю, яка краще описує не оператор: bennadel.com/blog/… developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Це перетворить ваш стан у логічне значення.
Ренді Колліє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.