Skip to content

Latest commit

 

History

History
58 lines (43 loc) · 2.94 KB

crazy-js.md

File metadata and controls

58 lines (43 loc) · 2.94 KB

Crazy JS things

({})[0]; // undefined

Потому что выражение ({}) возвращает своё тело, то есть {}, а вызов [0] от пустого объекта даёт undefined, ибо нет в нём нулевого элемента.


typeof typeof {}; // 'string'

Это просто - typeof {} возвращает 'object', а это строка, соответсвенно, получится выражение typeof 'object', что и даст 'string'.


function(){
    return typeof arguments; // 'object'
});

Объект arguments - это объект похожий на массив, который содержит аргументы, переданные в функцию. А раз arguments это объект, то и typeof arguments возвращает 'object'.


[] == false // true

Перед сравнением оператор равенства приводит обе величины к общему типу. При сравнении object и boolean схема приведения будет ToPrimitive(Object) == ToNumber(Boolean). ToNumber(X) пытается перед сравнением привести свой аргумент к числу. Такое поведение эквивалентно +A (унарный оператор +). Если ToPrimitive(X) получает объект в качестве аргумента, то производятся попытки привести его к примитиву, вызывая на нем методы A.toString и A.valueOf.

В итоге получается преобразование вида:

+false // 0
[].toString().valueOf() // ''

Что проводит к

'' == 0 // true

['1', '7', '11'].map(parseInt); // [1, NaN, 3]

Максимально банальная вещь. Во-первых, parseInt принимает два параметра - значение и основание системы счисления. Во-вторых, в callback функции map передается три параметра - currentValue, index, array.

Соответвенно, по итогу код выполняется примерно так:

parseInt('1', 0); // 1
parseInt('7', 1); // NaN
parseInt('11', 2); // 3

Что вновь привод к одной из прописных истин - необходимо всегда указывать основание системы счисления при использовании функции parseInt.