Странности JavaScript

1
1023
views

Перевод статьи «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, — дополняйте в комментариях!

1 КОММЕНТАРИЙ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here