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 href="http://www.ecma-international.org/ecma-262/6.0/#sec-number-constructor-number-value"
rel="nofollow noreferrer">spec for theNumber(value)
constructor uses aToNumber
function. - The href="http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber" rel="nofollow
noreferrer">spec for theToNumber(value)
function
says to useToPrimitive
for anobject
type (which an array is). - The primitive value of an array
is equal to having the array joined, e.g.[]
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 toMath.min("")
or
Math.min(0)
Math.min([1])
is equal toMath.min("1")
or
Math.min(1)
Math.min([1,
is equal to
2])Math.min("1,2")
which cannot be
converted to a number.
No comments:
Post a Comment