Чому Math.min працює з масивом одного елемента


17

За даними MDN, Math.min приймає лише числа, і якщо один з аргументів не число, він повернеться NaN. Це правда , що якщо ми передаємо масив з декількома номерами ми отримуємо NaN, наприклад: Math.min([1,2]), але якщо ми використовуємо масив тільки з одним номером, Math.minповертає число в масиві, як в цьому прикладі: Math.min([5]). Хтось має уявлення, чому ми бачимо цю незадокументовану поведінку?


Відповіді:


47

Згідно з MDN, Math.min приймає лише числа, і якщо один з аргументів не число, він повернеться NaN.

Це не те, що сказано ( сміливий акцент мій):

Якщо хоча б один аргумент не може бути перетворений в число, результат є NaN.

Перетворення типу:

  • Math.minвикористовує ToNumberдля перетворення своїх аргументів.
  • ToNumberвикористовує ToPrimitiveдля перетворення Objects (і Arrays є Objects).
  • ToPrimitive використовує toString
  • [5].toString()є '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 насправді дивно читабельна.
Йорг W Міттаг

3
Так. Number([1,2]);Результати NaN , але Number([1])результати 1.
Bhojendra Rauniyar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.