JavaScript — это язык, на котором можно написать одну и ту же функцию пятью разными способами
и всё равно получить баг.
📝 Здесь собраны примеры странного поведения JS, которые ломают мозг разработчикам.
NaN !== NaNconsole.log(NaN === NaN); // false
Почему?
В JavaScript NaN означает "не число", а сравнение "не числа" с "не числом" — это не число. Логично, да?
typeof null === 'object'console.log(typeof null); // 'object'
Почему?
Это баг из 1995 года, который решили оставить "как фичу". Теперь это часть стандарта ECMAScript.
[] + [] === ""console.log([] + []); // ""
console.log([] + {}); // "[object Object]"
console.log({} + []); // 0
Почему?
JS пытается привести массив к строке, но делает это очень... по-своему.
0.1 + 0.2 !== 0.3console.log(0.1 + 0.2); // 0.30000000000000004
Почему?
Потому что JavaScript использует IEEE 754 (числа с плавающей запятой), а там 0.1 и 0.2 хранятся с погрешностью.
"5" - 1 !== "5" + 1console.log("5" - 1); // 4
console.log("5" + 1); // "51"
Почему?
Операция + приводит к строке, а - пытается работать с числами. Логика? Где ты?
parseInt("08") !== 8console.log(parseInt("08")); // 0 (в некоторых версиях)
Почему?
JS по умолчанию считал числа с 0 восьмеричными (0o), но потом это изменили в ES5.
true + true !== "true" + "true"console.log(true + true); // 2
console.log("true" + "true"); // "truetrue"
Почему?
true → это 1, а "true" → строка. Всё просто, правда?
🛠 Проверяй типы данных (typeof) перед операциями.
🛠 Используй === вместо == (чтобы не было магических приведений типов).
🛠 Ограничивай использование + со строками и числами.
🛠 Линтеры (ESLint, Prettier) помогут избежать некоторых ошибок.
JavaScript – это как игра в угадайку: "А как оно сработает сейчас?"
Но если разобраться в его странностях, он может стать мощным инструментом.