Перевод статьи «JavaScript is weird».
Разработчикам, переходящим к JavaScript от других языков программирования (например, C++ или C#), он может казаться довольно странным. И небезосновательно: некоторые особенности этого языка могут с ума свести. В этой статье мы рассмотрим пять простых примеров.
Числовые разделители
Возьмем, к примеру, следующий код:
const number1 = 2_0_0_0; const number2 = 6_0_0_0; console.log(number1 + number2);
Как думаете, каков будет результат? Можете скопировать этот отрывок и вставить в консоли браузера (в инструментах разработчика) или на Codepen.
В результате получается 8000, но почему?
Дело в том, что символ подчеркивания (_) это числовой разделитель для числовых литералов. Он используется для группирования цифр, чтобы числа легче читались.
Например, число 1234567 будет проще прочесть, если записать его как 1_234_567.
Некоторые типы тоже очень странные
Еще один пример — при запуске кода typeof null возвращается object. Т. е., null является объектом, а это неправильно, потому что null это примитивное значение.
typeof null; // результат - object
В данном случе, правда, речь идет не о странности, а о баге в языке. Причем этот баг нельзя исправить из-за проблем с обратной совместимостью. Подробнее об этом можно почитать на Хабре.
А между тем…
typeof NaN; // результат - number.
Ну не странно ли, что NaN («not a number» — «не число») является числом?! А вдобавок NaN не равен себе самому.
console.log(NaN === NaN); //значение - false.
Функции
В JavaScript функция может вызывать себя самостоятельно. Речь идет о IIFE (Immediately-invoked Function Expression) — немедленно вызываемых функциональных выражениях. Используя их, вы можете объявлять функцию и выполнять ее в одном предложении.
(function() { console.log('hello'); })(); //выводит 'hello'
Насколько я знаю, такое есть только в JavaScript. Это довольно полезная особенность. Она позволяет избежать поднятия переменных в блоках, защитить от засорения глобальное окружение и одновременно разрешить публичный доступ к методам, сохраняя при этом приватность для переменных, определенных внутри функции.
Вот хорошая статья, в которой можно почитать об IIFE.
Сброс массива
И, наконец, самый странный способ очищения массива: вы можете установить длину массива в ноль: arr.length = 0;.
const arr = [1,2,3,4,5,6]; console.log(arr); // выводит [1, 2, 3, 4, 5, 6] arr.length = 0; console.log(arr); // выводит []
Надеемся, вам было интересно. Если знаете еще какие-то странности JavaScript, — дополняйте в комментариях!
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]
Подчеркивание чисел в пхп тоже поддерживается