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

Почему Math.min([]) оценивает значение 0?

Почему Math.min([]) оценивается до 0?

Я ожидал бы, что он будет оценивать до NaN, так как MDN manpage для Math.min утверждает: "Если хотя бы один из аргументов не может преобразуется в число, возвращается NaN."

Итак, я думаю, что уточненный вопрос - почему [] принуждает к 0? Особенно учитывая, что [] является правдивым (т.е. !![] === true) и Math.min(true) === 1. Я думаю об этом неправильно?

Протестировано на Node v7.0.0

4b9b3361

Ответ 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"), который не может быть преобразован в число.