2011-03-25 17 views
2

1)function smallestがなぜ失敗するのですか?私はそれがJavaScript数学(パラメータ渡し、配列、および「適用」メソッド)

function getMin(x,y) { //from Mozilla documentation 
    return Math.min(x,y) 
} 



function smallest(array){ //my own experimentation with Resig`s example 
    return Math.min(array); 
} 
function largest(array){  //from John Resig`s learning advanced JavaScript #41 
    return Math.max.apply(Math, array); 
} 
assert(smallest([0, 1, 2, 3]) == 0, "Locate the smallest value."); 
assert(largest([0, 1, 2, 3]) == 3, "Locate the largest value."); 

答えて

3

Math.minMath.maxは引数として、数字の任意の数をとります。 smallestは数字ではなく配列を渡そうとしています。

apply(例ではlargestのように)を使用すると、配列の要素が引数として貼り付けられます。

1

を比較する前に、番号にその引数を変換しminので、配列として渡されたとき、それは動作しません

function smallest(array) { return Math.min.apply(Math, array); } 

試してみてくださいと言うのMozillaのドキュメントhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/min、例に準拠して考えます。配列に数値を変換しようとすると、配列に数字のような単一の要素が含まれていない限り、NaNが生成されます。

ので

Math.min([3]) === 3 
Math.min('3') === 3 

しかし

isNaN(Math.min([3, 4])) // because, 
isNaN(Math.min('3,4')) // which is the same as 
isNaN(Math.min(+'3,4')) // which is equivalent to 
isNaN(Math.min(NaN)) 
+0

私はあなたが作品を提供していることを知っていますが、なぜ私の例がMozillaの例を確認しているように見えているのかは分かりません。 – mjmitche

+0

さて、OPになぜ「適用」が必要なのかを説明するべきです(彼はすでにそれが必要であることを実証済みです:「最大」を参照)。 –

+0

@Chris Jester-Young、編集を参照してください。 –

2

この例には準拠していません。ドキュメントの[]はオプションのインジケータであり、配列の区切り文字ではありません。

1

.apply(object, array)は、配列を引数リストに展開する正しい構文です。すべての引数を数値に変換する関数に配列を渡すだけでは、NaNしか表示されないので便利ではありません。

5

"Math.min()"関数は、任意の数の引数を取ることができます。しかし、単一の配列を関数に渡すだけでは、という引数を複数渡さずにに渡すだけです。その1つの引数は配列そのものです。配列は、一流の値です。

これは、すべての機能で使用できる「適用」機能の全体的なポイントです。この関数は、関数を呼び出し、配列インスタンス内の項目で構成される引数リストを渡すために使用されます。

var array = [ 1, 2, 3, 4, 5 ]; 
someFunction.apply(irrelevant, array); 

呼び出すようなものだもの:

someFunction(1, 2, 3, 4, 5); 

(「無関係」引数は、関数呼び出しのthis値として使用することが何である。)

+0

私はあなたが「一流」ではなく「一流」を意味すると思います。 :-) –

+0

私にとっては、彼らは「ファーストクラス」**と「ファーストレート」の両方です:-) – Pointy

1

適用あなたはこれを行うとは、配列を引数オブジェクトとしてMath.minに渡します。 Math.min(a、b、c、d、e)

smすべてが配列全体を最初の記念碑として渡しています。

Math.min(x) これは実際には比較対象がありません。

関連する問題