なぜMath.min([])
は0
と評価されますか?Math.min([])が0に評価されるのはなぜですか?
NaN
MDN's manpage for Math.min "少なくとも1つの引数を数値に変換できない場合は、NaNが返されます。"と評価されます。
私は洗練された質問はなぜ[]が0に強制するのでしょうか? []
が真実(すなわち、)であり、Math.min(true) === 1
であると特に考えている。私はこの間違いを考えているのですか?ノードV7.0.0でテスト
なぜMath.min([])
は0
と評価されますか?Math.min([])が0に評価されるのはなぜですか?
NaN
MDN's manpage for Math.min "少なくとも1つの引数を数値に変換できない場合は、NaNが返されます。"と評価されます。
私は洗練された質問はなぜ[]が0に強制するのでしょうか? []
が真実(すなわち、)であり、Math.min(true) === 1
であると特に考えている。私はこの間違いを考えているのですか?ノードV7.0.0でテスト
なぜ
Math.min([])
は0
に評価されていますか?
スペックはそう言うので:
Math.min
を使用して番号に各パラメータをキャスト...
ToPrimitive
が使用プリミティブ値にオブジェクトをキャスト...使用数にオブジェクトをキャスト...
[[Default Value]]
内部メソッドは、そのヒントパラメータに基づいてプリミティブにオブジェクトを変換します。
The default hint for all objects is string。つまり、配列は文字列に変換され、[]
は""
です。
ToNumber
はその後the documented algorithm
Math.min
ごとに、0
へ""
変換し、そのアルゴリズムごとに、唯一のパラメータを受け取り、それを返します。
ああ...なぜ、長さ0または1の配列だけが強制的に ' Math.min([1,42]) 'はNaNになります – jtpeterson
[]
が0
に強制変換されるためです。
あなたは次の呼び出しでこれを見ることができます:
(new Number([])).valueOf(); // 0
したがって、Math.min([])
を呼び出すと0
を与えるMath.min(0)
を呼び出すのと同じです。 spec for the Number(value)
constructorはToNumber
機能を使用しています
私はその理由がnew Number([])
扱い0
として[]
であると信じています。
ToNumber(value)
functionはobject
タイプ(配列)でToPrimitive
を使用すると言います。[]
は""
となり、[0]
は"0"
となり、[0, 1]
は"0,1"
となる。[]
を""
に変換し、次に0
として解析されます。上記の動作が内部一つまたは二つの数字の配列をMath.min(...)
に渡すことができ、より多くの配列ができないことの理由である:
Math.min([])
はMath.min("")
又はMath.min(0)
Math.min([1])
がMath.min("1")
又はMath.min(1)
Math.min([1, 2])
と等しいことCONVERできないMath.min("1,2")
に等しいです。番号につなげた。オリジナルの質問はこれを認めています:* "なぜ私は洗練された質問が[0] *に強制するのかと推測しています。私はOPがこの強制がなぜ起こるのかを知りたいと思う。 –
ありがとうございます。長さ0または1の配列は数値に変換されます。 Go figure。下のほうに便利なテーブルがあります。http://www.w3schools.com/js/js_type_conversion.asp – jtpeterson
空の配列は数値に変換することができます。数字はゼロです。 –
https://jsfiddle.net/xq3185ym/ –
...仕様でそう言います。 – zzzzBov