3

奇妙な質問ですが、jQuery.each()indexInArrayを使用するたびに、ネイティブのように が最初の引数であり、2 番目の引数ではない (2 番目の引数は現在値自体である) のはなぜだろうかarray.forEach()?

APIドキュメントにもかなりの数の賛成票がある、同じですが未回答の質問.each()があります!

多くの場合、インデックスではなく値に「作用する」コードを見つけ、その結果、関数の本体に未使用の変数ができます (これにより、js(h|l)int が文句を言いますが、私の意見では正当な理由があります)。 . では、なぜ値が最初の引数ではないのでしょうか?

これは、以前のバージョンの実装がよく考えられていなかったことによる後遺症ですか、それともこれには正当な理由がありますか?

4

1 に答える 1

6

その理由は、 の最初の引数である値は、jQuery が として提供するforeachため、 ではあまり必要とされないためです。$.eachthis

したがって、インデックスはより頻繁に役立つようです。これは正当な理由です。

これには危険thisが伴います: 値がプリミティブ型の場合、値とまったく同じではありません: この場合、値はオブジェクトとしてラップされます。

なぜ危険なのですか?

理由は次のとおりです。

[1, 2, 3].forEach(function(v) {
    if (v===2) console.log('found!');
});

コンソールでの出力:

found!

今jQueryで:

$.each([1, 2, 3], function() {
    if (this===2) console.log('found!');
});

出力は何ですか?

何もない。

(この関連する質問で、これにつながる実装について詳しく説明していることに注意してください。)

標準の javascript 関数に慣れてきた今日では、別の順序があったほうがよいと思われるかもしれません (それがUnderscore.jsの選択でした)。インデックスを最初に提供する理由は良かったのですが、十分ではないかもしれません。$.eachしかし、一般に利用できるようになった現在foreach(少なくとも配列の場合) を使用し続けることはおそらくないので、実際には問題ではないかもしれません。

于 2013-01-03T14:11:09.957 に答える