Math.max.apply()はどのように機能しますか?


82

どのように機能しMath.max.apply()ますか?

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <script>
      var list = ["12","23","100","34","56",
                                    "9","233"];
      console.log(Math.max.apply(Math,list));    
  </script>
</body>
</html>

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

上記のコードは、リスト内の最大数を検索します。以下のコードはどのように機能するのか誰か教えてもらえますか?合格すればうまくいくようですnull or Math.

console.log(Math.max.apply(Math,list));

すべてに、user-defined/Native functions使用できるcall and applyメソッドがありますか?

回答:


139

apply配列を受け入れ、その配列をパラメーターとして実際の関数に適用します。そう、

Math.max.apply(Math, list);

として理解することができます、

Math.max("12", "23", "100", "34", "56", "9", "233");

したがって、これapplyはデータの配列をパラメーターとして関数に渡すための便利な方法です。覚えておいてください

console.log(Math.max(list));   # NaN

ので、動作しませんmax入力として配列を受け入れません。

を使用applyすることには別の利点があり、独自のコンテキストを選択できます。apply関数の最初のパラメーターは、thisその関数の内部に渡されます。ただし、max現在のコンテキストには依存しません。したがって、の代わりに何でも機能しMathます。

console.log(Math.max.apply(undefined, list));   # 233
console.log(Math.max.apply(null, list));        # 233
console.log(Math.max.apply(Math, list));        # 233

以来apply、実際に定義されているFunction.prototype任意の有効なJavaScript関数オブジェクト、必要がありますapplyデフォルトでは、機能を。


3
@Shaneそれは私たちがコンテキストを設定した場合でも動作します、なぜならundefinednull:)場合はmax、コンテキスト内のアクセス/変更は何もしようとしたコンテキストに設定されている場合、それが失敗しただろうundefinednull
thefourtheye 2014年

2
@NiCkNewman実際にMath.maxは、コンテキストを必要としないため、最初のパラメーターは使用しません。引数で受け取ったデータに対してのみ動作します。
thefourtheye 2015年

1
@NiCkNewmanコメントセクションで議論するには広すぎます。しかし、この記事thisは良い出発点になるでしょう。またcallapplyこれを詳しく説明するセクションもあります。
thefourtheye 2015年

2
.apply()の最高の説明!
microcipcip 2016

1
なぜnullまたは数学?


17

以下のコードがどのように機能するか誰かに教えてもらえますか?

Math.max.apply(Math,list)

関数の実装(本体)で参照として使用され、引数として渡されるオブジェクトを使用Math.maxして関数を呼び出します。Maththislist

したがって、これは最終的には

Math.max("12","23","100","34","56", "9","233")

nullまたはMathを渡せばうまくいくようです。

明らかに、Math.max実装はインスタンス変数を使用しません-そうする理由はありません。ネイティブ実装は、繰り返しargumentsて最大のものを見つけるだけです。

すべてのユーザー定義/ネイティブ関数には、使用できるcallおよびapplyメソッドがありますか?

はい、すべての関数はcallまたはを使用して呼び出すことができますapply

参照:


3

私は言って開始しますMath.max(...numbers)と、Function.prototype.apply()比較的少数の要素を持つ配列を使用する必要があります。(...)配列が大きすぎる場合、applyは失敗するか、間違った結果を返します

Math.max.apply(null | undefined | Math, numbers)同じであるMath.max(...numbers)ので、私は推薦するMath.max(...numbers)美的な理由のために。

const numbers = [5, 6, 2, 3, 7];

const max = Math.max(...numbers);

console.log('max:', max);
// expected output: 7

const min = Math.min(...numbers);

console.log('min:', min);
// expected output: 2

非常に大きい数値配列で最大要素を見つける必要がある場合は、このArray.reduce()メソッドを使用します。

Array.reduce() 各値を比較することにより、数値配列の最大要素を見つけるために使用できます。

const numbers = [5, 6, 2, 3, 7];
const getMax = (numbers) => numbers.reduce((a, b) => Math.max(a, b));

const getMin = (numbers) => numbers.reduce((a, b) => Math.min(a, b));
	
const max = getMax(numbers)
const min = getMin(numbers)

console.log('max:', max)
console.log('min:', min)

結論:

比較的小さいMath.max(...numbers) 数値配列:非常に大きい数値配列を使用する:Array.reduce()メソッドを使用する


1
JavaScriptCoreエンジンには65536のハードコードされた引数制限があるため、apply()を使用するときは、配列サイズが常に小さくなるようにする必要があります。
チャーマン

2

Math.max(val1、val2、...)

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...はパラメータであり、Numbers MDNMath.maxである必要があります

パラメータarrayとして渡すことはできませんMath.max。配列を渡すには、を使用する必要がありますapply

適用する

applyの最初のパラメーターは、、this2番目のパラメーターはarrayです。数学メソッドは他の言語の静的メソッドと同等です。つまり、この場合はarray.prototype.slice渡す必要がないため、オブジェクトインスタンスは必要ありませんthis

var arr = [1, 2, 3];

Math.max(1, 2, 3);  // -> 3
Math.max(arr);      // -> NaN (Not a Number)
Math.max.apply(null, arr);  // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3

arr.slice(1);  // -> returns Array [2, 3]
Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)

配列をパラメーターとして渡したい場合は、を使用する必要がありapplyますcall。それ以外の場合は、を使用します。

A pply = A rray
Cすべて= C有するoMMA分離
コールの詳細&適用

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.