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