Странности Javascript

Здесь постараюсь описать странности JavaScript, со многими из которых я уже успел смирится, а некоторые понять и простить. Например самое любимое это:

a = null;
typeof a;   // "object"

это довольно популярная "шутка" является банальным багом языка, который закопан в нем видимо навсегда для сохранения обратной совместимости.

Приведения массива к строке

Здесь будет просто христоматийный пример из книги "You don't know JavaScript":

var a = [1,2,3];
var b = [1,2,3];
var c = "1,2,3";

a == c;     // true
b == c;     // true
a == b;     // false

При сравнении массива и строки в динамически типизированном JavaScript массив будет преобразован в строку путем конкатенации всех значений через запятую, т.о. массивы a и b после приведения к строке будут иметь значение эквивалентное переменной c. Проверяем:

> [1,2,3].toString()
'1,2,3'

Массивы в JavaScript это объекты, помните?

> typeof [1,2,3]
'object'

Объекты хранятся и сравниваются по ссылке, т.е. переменные a и b это два разных объекта.

Смотрим 11.9.3 The Abstract Equality Comparison Algorithm спеки EcmaScript5:

Return true if x and y refer to the same object. Otherwise, return false.

Comments