Почему Math.min([]) оценивает значение 0?
Почему Math.min([])
оценивается до 0
?
Я ожидал бы, что он будет оценивать до NaN
, так как MDN manpage для Math.min утверждает: "Если хотя бы один из аргументов не может преобразуется в число, возвращается NaN."
Итак, я думаю, что уточненный вопрос - почему [] принуждает к 0? Особенно учитывая, что []
является правдивым (т.е. !![] === true
) и Math.min(true) === 1
. Я думаю об этом неправильно?
Протестировано на Node v7.0.0
Ответы
Ответ 1
Почему Math.min([])
оценивается до 0
?
Потому что спецификация говорит так:
Math.min
переводит каждый параметр в число, используя...
ToNumber
отбрасывает объекты в число, используя...
ToPrimitive
отбрасывает объекты в примитивные значения, используя...
[[Default Value]]
внутренний метод преобразует объекты в примитивы на основе их параметра подсказки.
По умолчанию для всех объектов подразумевается строка. Это означает, что массив преобразуется в строку, которая для []
равна ""
.
ToNumber
затем преобразует ""
в 0
, за документированный алгоритм
Math.min
затем берет единственный параметр и возвращает его в соответствии с его алгоритмом.
Ответ 2
Это происходит потому, что []
принуждается к 0
.
Вы можете увидеть это со следующим вызовом:
(new Number([])).valueOf(); // 0
Поэтому вызов Math.min([])
совпадает с вызовом Math.min(0)
, который дает 0
.
Я считаю, что причина, по которой new Number([])
относится к []
как 0
, заключается в следующем:
Вышеприведенное поведение является причиной того, что массив с одним или двумя числами внутри него может быть передан в Math.min(...)
, но массив большего не может:
-
Math.min([])
равен Math.min("")
или Math.min(0)
-
Math.min([1])
равен Math.min("1")
или Math.min(1)
-
Math.min([1, 2])
равен Math.min("1,2")
, который не может быть преобразован в число.