[] == false ??
Коротка відповідь
Тому що під час порівняння через ==
JavaScript автоматично приводить обидві сторони до числа,
і зрештою порівнює 0 == 0.
Покрокове пояснення
Візьмемо:
[] == falseКрок 1. == викликає type coercion
При нестрогому порівнянні (==) JS намагається привести типи так, щоб порівняти коректно.
Алгоритм у стандарті ECMAScript §7.2.14 описаний так:
Якщо один з операндів -
boolean, він приводиться до числа.
Крок 2. Приводимо false → до числа
false → 0Тепер вираз виглядає так:
[] == 0Крок 3. JS бачить, що зліва об'єкт (масив), а справа - примітив
Якщо один з операндів - об'єкт, він спочатку приводиться до примітиву
(через valueOf() → toString()).
Для масиву []:
[].toString(); // ""Отже:
[] → "" // порожній рядокТепер у нас:
"" == 0Крок 4. Порівняння "" == 0
Згідно з тим самим алгоритмом:
Якщо один операнд - рядок, інший - число → рядок перетворюється на число.
Number("") → 0Отже:
0 == 0Результат:
trueПідсумок по кроках
| Етап | Вираз | Що сталося |
|---|---|---|
| 1 | [] == false | false → 0 |
| 2 | [] == 0 | [] → "" |
| 3 | "" == 0 | "" → 0 |
| 4 | 0 == 0 | true |
Чому це небезпечно
Ця логіка робить == непередбачуваним.
Ось ще приклади:
[] == ![] // true
'' == 0 // true
'0' == 0 // true
null == undefined // true
[] == '' // true
[0] == 0 // true
[1] == 1 // true
[2] == 2 // trueЯк уникнути плутанини
Використовуй строге порівняння ===,
яке не виконує неявного перетворення типів.
[] === false // false
"" === 0 // false
null === undefined // falseКоротко
| Вираз | Що робить JS | Результат |
|---|---|---|
[] == false | [] → "" → 0, false → 0 | true |
[] === false | Порівнює без приведення | false |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.