2017-01-11 9 views
24

なぜMath.min([])0と評価されますか?Math.min([])が0に評価されるのはなぜですか?

NaNMDN's manpage for Math.min "少なくとも1つの引数を数値に変換できない場合は、NaNが返されます。"と評価されます。

私は洗練された質問はなぜ[]が0に強制するのでしょうか? []が真実(すなわち、)であり、Math.min(true) === 1であると特に考えている。私はこの間違いを考えているのですか?ノードV7.0.0でテスト

+3

空の配列は数値に変換することができます。数字はゼロです。 –

+0

https://jsfiddle.net/xq3185ym/ –

+2

...仕様でそう言います。 – zzzzBov

答えて

29

なぜMath.min([])0に評価されていますか?

スペックはそう言うので:

Math.minを使用して番号に各パラメータをキャスト...

ToNumber

ToPrimitiveが使用プリミティブ値にオブジェクトをキャスト...使用数にオブジェクトをキャスト...

[[Default Value]]

内部メソッドは、そのヒントパラメータに基づいてプリミティブにオブジェクトを変換します。

The default hint for all objects is string。つまり、配列は文字列に変換され、[]""です。

ToNumberはその後the documented algorithm

Math.minごとに、0""変換し、そのアルゴリズムごとに、唯一のパラメータを受け取り、それを返します。

+2

ああ...なぜ、長さ0または1の配列だけが強制的に ' Math.min([1,42]) 'はNaNになります – jtpeterson

14

[]0に強制変換されるためです。

あなたは次の呼び出しでこれを見ることができます:

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

したがって、Math.min([])を呼び出すと0を与えるMath.min(0)を呼び出すのと同じです。 spec for the Number(value) constructorToNumber機能を使用しています


  1. 私はその理由がnew Number([])扱い0として[]であると信じています。

  2. spec for the ToNumber(value) functionobjectタイプ(配列)でToPrimitiveを使用すると言います。
  3. 配列のプリミティブ値は、配列が結合されていることと同じです。 []""となり、[0]"0"となり、[0, 1]"0,1"となる。
  4. したがって、数値コンストラクタは[]""に変換し、次に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")に等しいです。番号につなげた。
+3

オリジナルの質問はこれを認めています:* "なぜ私は洗練された質問が[0] *に強制するのかと推測しています。私はOPがこの強制がなぜ起こるのかを知りたいと思う。 –

+1

ありがとうございます。長さ0または1の配列は数値に変換されます。 Go figure。下のほうに便利なテーブルがあります。http://www.w3schools.com/js/js_type_conversion.asp – jtpeterson

関連する問題