Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

js>

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

Ответ 2

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

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

Ответ 3

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

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

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

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