JavaScript: порожній масив, [] отримує значення true в умовних структурах. Чому це?


99

Я зіткнувся з багатьма помилками у своєму коді, тому що очікував такого виразу:

Boolean([]); оцінювати до false.

Але це було не так, оскільки це оцінили як істину.

Отже, функції, які можливо повернулися []так:

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

не робив очікуваних речей.

Я помиляюся, припускаючи, що []це порожній масив?

Крім того, чи така поведінка відповідає всім браузерам? Або там теж є якісь причепи? Я, до речі, спостерігав таку поведінку в Goolgle Chrome.


5
масиви - це об’єкти, об’єкти - істинні. просто попросіть array.length, якщо не нуль, це буде неправдиво. при явному перетворенні в Boolean масив спочатку перетворюється на порожній рядок, а потім порожній рядок перетворюється на false.
dandavis

1
Чому ви не використовуєте myCollection.length > 0?
Стів

1
@Steve - це не спрацює, якщо myCollectionтрапляється nullабо undefined. Вам потрібно використовувати if(myCollection && myCollection.length > 0).
Тед Хопп,

@TedHopp - звичайно ... Я просто вказував, що myCollection.length > 0пропонує логічне значення, яке робить те, про що просив ОП ... йому ще потрібно виконати роботу звідти.
Стів

Відповіді:


118

З http://www.sitepoint.com/javascript-truthy-falsy/

Наступні значення завжди хибні:

  • помилковий
  • 0 (нуль)
  • "" (порожній рядок)
  • нуль
  • невизначений
  • NaN (спеціальне значення Числа, що означає Не-число!)

Усі інші значення неправдиві, включаючи "0" (нуль у лапках), "false" (помилкове в лапках), порожні функції, порожні масиви та порожні об'єкти.

Щодо того, чому це так, я підозрюю, що це тому, що масиви JavaScript - це лише певний тип об’єкта. Особлива обробка масивів потребує додаткових накладних витрат для перевірки Array.isArray(). Крім того, це, мабуть, заплутало б, якби справжні масиви поводилися інакше, ніж інші масивоподібні об'єкти в цьому контексті, тоді як змусити всі масивноподібні об'єкти поводитися однаково було б ще дорожче.


27
Якщо ви перевірите вираз, яким [] == falseвоно обчислюється true.
m.rufca


є декілька таблиць, що показують несподівані ситуації з використанням ==компаратора у посиланні, яке ви розмістили. Я прокоментував лише для того, щоб бути обережними, очікуючи істинної чи хибної оцінки.
m.rufca

4
Це насправді не відповідає на запитання, чому було ЧОМУ. Чому порожній масив неправдивий, коли порожній рядок хибний? Як свідоме рішення щодо дизайну, це відчувається дуже погано.
Іса Ліндквіст,

1
Можливо, тому, що від них вимагається діяти як первісні об’єкти. Але Javascript не має примітивних масивів.
Бармар,

28

Ви повинні перевірити .lengthцей масив, щоб побачити, чи містить він якісь елементи.

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

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