Skip to main content

[] == false ??

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

Тому що під час порівняння через == JavaScript автоматично приводить обидві сторони до числа, і зрештою порівнює 0 == 0.


Покрокове пояснення

Візьмемо:

javascript
[] == false

Крок 1. == викликає type coercion

При нестрогому порівнянні (==) JS намагається привести типи так, щоб порівняти коректно. Алгоритм у стандарті ECMAScript §7.2.14 описаний так:

Якщо один з операндів - boolean, він приводиться до числа.


Крок 2. Приводимо false → до числа

javascript
false0

Тепер вираз виглядає так:

javascript
[] == 0

Крок 3. JS бачить, що зліва об'єкт (масив), а справа - примітив

Якщо один з операндів - об'єкт, він спочатку приводиться до примітиву (через valueOf()toString()).

Для масиву []:

javascript
[].toString(); // ""

Отже:

javascript
[]"" // порожній рядок

Тепер у нас:

javascript
"" == 0

Крок 4. Порівняння "" == 0

Згідно з тим самим алгоритмом:

Якщо один операнд - рядок, інший - число → рядок перетворюється на число.

javascript
Number("")0

Отже:

javascript
0 == 0

Результат:

javascript
true

Підсумок по кроках

ЕтапВиразЩо сталося
1[] == falsefalse → 0
2[] == 0[] → ""
3"" == 0"" → 0
40 == 0true

Чому це небезпечно

Ця логіка робить == непередбачуваним. Ось ще приклади:

javascript
[] == ![] // true '' == 0 // true '0' == 0 // true null == undefined // true [] == '' // true [0] == 0 // true [1] == 1 // true [2] == 2 // true

Як уникнути плутанини

Використовуй строге порівняння ===, яке не виконує неявного перетворення типів.

javascript
[] === false // false "" === 0 // false null === undefined // false

Коротко

ВиразЩо робить JSРезультат
[] == false[] → "" → 0, false → 0true
[] === falseПорівнює без приведенняfalse

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

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.