Почему Math.min работает с массивом из одного элемента

17

Согласно MDN Math.min принимает только числа, и если один из аргументов не является числом, он вернется NaN. Это правда , что если мы передаем массив с несколькими номерами мы получаем NaN, например: Math.min([1,2]), но если мы используем массив только с одним номером, Math.minвозвращает число в массиве, как в этом примере: Math.min([5]). У кого-нибудь есть идея, почему мы видим это недокументированное поведение?

someone235
источник

Ответы:

47

Согласно MDN Math.min принимает только числа, и если один из аргументов не является числом, он вернется NaN.

Это не то, что он говорит ( жирный акцент мой):

Если хотя бы один из аргументов не может быть преобразован в число, результат будет NaN.

Тип преобразования:

  • Math.minиспользует ToNumberдля преобразования своих аргументов.
  • ToNumberиспользует ToPrimitiveдля преобразования Objects (и Arrays являются Objects).
  • ToPrimitive использования toString
  • [5].toString()is '5', который возвращается в ToPrimitive, который возвращает его ToNumber, который анализирует 5и возвращает его Math.min, для которого он является допустимым аргументом, потому что это не так NaN.
  • [1, 2].toString(), OTOH, есть '1, 2', который возвращается ToPrimitive, который возвращает его ToNumber, который анализирует его NaN, потому что он не является допустимым числовым представлением. ToNumberзатем переходит NaNк Math.min, который затем возвращает NaN, потому что (как утверждает MDN) «один из его аргументов не может быть преобразован в число» или (как указано в спецификации) «Если какое-либо значение равно NaN, результатом является NaN».
Йорг Миттаг
источник
25
Спецификация ECMAScript на самом деле удивительно читабельна, я только что узнал.
Йорг Миттаг
3
Да. Number([1,2]);Результаты NaN , но Number([1])результаты 1.
Bhojendra Rauniyar