Why does Math.min([]) evaluate to 0?

This question already has an answer here:

  • Why does ++[[]][+[]]+[+[]] return the string “10”? 8 answers

  • Why does Math.min([]) evaluate to 0 ?

    Because the spec says so:

    Math.min casts each parameter to a number using...

    ToNumber casts objects to a number using...

    ToPrimitive casts objects to primitive values using...

    [[Default Value]] internal method converts objects to primitives based on their hint parameter.

    The default hint for all objects is string. Which means the array gets converted to a string, which for [] is "" .

    ToNumber then converts "" to 0 , per the documented algorithm

    Math.min then takes the only parameter and returns it, per its algorithm.


    This happens because [] is coerced to 0 .

    You can see this with the following call:

    (new Number([])).valueOf(); // 0
    

    Therefore, calling Math.min([]) is the same as calling Math.min(0) which gives 0 .


    I believe that the reason that new Number([]) treats [] as 0 is because:

  • The spec for the Number(value) constructor uses a ToNumber function.
  • The spec for the ToNumber(value) function says to use ToPrimitive for an object type (which an array is).
  • The primitive value of an array is equal to having the array joined, eg [] becomes "" , [0] becomes "0" and [0, 1] becomes "0,1" .
  • The number constructor therefore converts [] into "" which is then parsed as 0 .
  • The above behaviour is the reason that an array with one or two numbers inside it can be passed into Math.min(...) , but an array of more cannot:

  • Math.min([]) is equal to Math.min("") or Math.min(0)
  • Math.min([1]) is equal to Math.min("1") or Math.min(1)
  • Math.min([1, 2]) is equal to Math.min("1,2") which cannot be converted to a number.
  • 链接地址: http://www.djcxy.com/p/48042.html

    上一篇: JavaScript数组编号

    下一篇: 为什么Math.min([])的计算结果为0?