3
function multiMax(multi){
// Make an array of all but the first argument
var allButFirst = Array().slice.call( arguments, 1 );

// Find the largest number in that array of arguments
var largestAllButFirst = Math.max.apply( Math, allButFirst );

// Return the multiplied result
return multi * largestAllButFirst;
}
assert( multiMax(3, 1, 2, 3) == 9, "3*3=9 (First arg, by largest.)" );

http://ejohn.org/apps/learn/#47から

誰にでも2つ質問があります。

  1. Math().max ではなく Array().slice を使用する必要があるのはなぜですか。
  2. なぜ Array.prototype.slice ではなく Array().slice を使用するのですか (Array.prototype.slice が機能することに気付きましたが、このインスタンスだけでなく、なぜ一方を他方よりも優先して使用するのかを理解しようとしています) 、しかしいずれにせよ)

ありがとうございました。

4

2 に答える 2

2

Math().max ではなく Array().slice を使用する必要があるのはなぜですか?

Array()の代わりに が使用される理由Array.prototypeは、この特定の例では一方が他方の省略形であるためです。

まず、両方Array().slice.call(arguments, 1);と同じ効果があります:[].slice.call(arguments, 1);

したがって、最初の質問に答えるために、彼らはそこでそれを使用する必要はありません。単に好みのためにそこで使用されます。Array.prototype.slice.call(arguments, 1);または[].slice.call(arguments, 1);置換することができ、関数は引き続き期待どおりに機能します。

に関してはMath.max.apply(Math, allButFirst);、オブジェクトをインスタンス化できないという点でのような「クラス」ではありません(試してみてください)Math。インスタンス化できないため、/と同じ方法で構文的にアクセスまたは操作することはできません。ArrayMathArray()[]

それはあなたの2番目の質問にも答えるはずです。

newbmceldowney が言ったように、通常、キーワードなしでコンストラクターを呼び出すことはありません。合法ではありますが、(個人的に)見るのはイライラしますし、実生活での良い習慣だとは思いません.

于 2013-03-21T06:46:39.387 に答える
1

私のベストショット:

  1. Array() は空の配列インスタンスを返しますが、Array は単なるコンストラクター関数です。.slice メソッドは、プロトタイプを介して配列インスタンスにのみ存在するため、Array.slice は機能しません。Math はコンストラクター関数ではなく、多数のユーティリティ メソッドを持つオブジェクトであり、そのうちの 1 つが max です。

  2. Array().slice と Array.prototype.slice の間に大きな違いがあるかどうかはわかりませんが、投稿したコードは非常に高く評価されているようです。

通常、そのように意図的に「new」キーワードなしでコンストラクター関数が呼び出されることはありません。これはあまり良い習慣ではないと思います。これは間違いなく巧妙なコードであり、通常は保守性が低いことを意味します。

于 2013-03-21T06:46:06.387 に答える