Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «[] == false ??». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`[] == false`** повертає `true`, бо під час порівняння через `==` **JavaScript автоматично приводить обидві сторони до числа**, і зрештою порівнює `0 == 0`. **Ключове:** `[]` спершу перетворюється на `""`, потім на `0`, а `false` одразу на `0` - тому `==` бачить `0 == 0` і повертає `true`; строге порівняння `===` цього не робить і дає `false`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротка відповідь Тому що під час порівняння через `==` **JavaScript автоматично приводить обидві сторони до числа**, і зрештою порівнює `0 == 0`. --- ## Покрокове пояснення Візьмемо: ```javascript [] == false ``` ### Крок 1. `==` викликає **type coercion** При нестрогому порівнянні (`==`) JS намагається привести типи так, щоб порівняти коректно. Алгоритм у стандарті ECMAScript §7.2.14 описаний так: > Якщо один з операндів - `boolean`, він приводиться до числа. --- ### Крок 2. Приводимо `false` → до числа ```javascript false → 0 ``` Тепер вираз виглядає так: ```javascript [] == 0 ``` --- ### Крок 3. JS бачить, що **зліва об'єкт (масив)**, а справа - примітив Якщо один з операндів - об'єкт, він спочатку приводиться до **примітиву** (через `valueOf()` → `toString()`). Для масиву `[]`: ```javascript [].toString(); // "" ``` Отже: ```javascript [] → "" // порожній рядок ``` Тепер у нас: ```javascript "" == 0 ``` --- ### Крок 4. Порівняння `"" == 0` Згідно з тим самим алгоритмом: > Якщо один операнд - рядок, інший - число → рядок перетворюється на число. ```javascript Number("") → 0 ``` Отже: ```javascript 0 == 0 ``` Результат: ```javascript true ``` --- ## Підсумок по кроках | Етап | Вираз | Що сталося | |---|---|---| | 1 | `[] == false` | `false → 0` | | 2 | `[] == 0` | `[] → ""` | | 3 | `"" == 0` | `"" → 0` | | 4 | `0 == 0` | `true` | --- ## Чому це небезпечно Ця логіка робить `==` **непередбачуваним**. Ось ще приклади: ```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 → 0` | `true` | | `[] === false` | Порівнює без приведення | `false` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.