Почему Number ([]) = = = 0 и Number ({}) = = = NaN в Javascript?


Я смотрел на первую таблицу на http://zero.milosz.ca/, и хотел понять, почему, например, 0 == [] и 0 != {}. Я предполагаю, что это потому, что Number([]) == 0 и Number({}) == NaN. Однако эта часть кажется произвольной. Почему пустой список 0 и пустой объект a NaN?

3   12   2012-06-21 22:39:53

3 ответа:

Using Number(some_object) будет использовать строковое представление данного объекта. Для ваших примеров строковые представления:

js> ({}).toString();
[object Object]
js> [].toString();

js>

Строка '[object Object]' не может быть преобразована в число, но пустая строка '' может.

Чтобы немного развить ответ ThiefMaster, я заглянул в спецификации ECMAScript :

При преобразовании строки в число для преобразования используется грамматика. В частности, математическое значение StringNumericLiteral ::: [empty] определяется как 0. На самом деле, это 0 для любого пробела.

Когда одно значение является объектом ([], {}), а другое-числом или строкой, оператор == преобразует объект в примитивное значение (в данном случае число), используя встроенные методы преобразования, которые наследуют все объекты в Javascript: toString () и valueOf () .

Для универсальных объектов, таких как {}, используется valueOf , и по умолчанию он возвращает сам объект, который есть != 0.

Для встроенных массивов используетсяtoString . Этот метод применяется к массив возвращает строку, содержащую все элементы, Соединенные запятыми. Для пустого массива он возвращает пустую строку, ".

Тогда интерпретатор применяет valueOf к этой строке; возвращаемое значение этого метода для пустой строки равно 0, поэтому [] == 0.