3

私はそれがarguments実際の配列ではないことを除いて、関数内が配列のようなものであることは古いJavascriptの動作だと思います(Crockfordはそれは設計エラーだと言いました)。

function foo() { console.log(arguments.slice(1)) }   // won't work
foo(1,2,3);

最新の Firefox と Chrome で試してみましたが、どちらでも動作しません。したがって、使用する必要があるかもしれません

function foo() { console.log(Array.prototype.slice.call(arguments, 1)) }
foo(1,2,3);

しかしarguments、最新の JavaScript で実際の配列を作成してみませんか? arguments実際の配列ではないことに依存するプログラムはおそらくないはずですか? 現在、実際の配列にしない理由は何でしょうか?

私が考えることができる理由の 1 つは、プログラマーが配列として扱い始めると、そのコードは古いブラウザーでは機能しなくなりますが、ECMA-5 には古いブラウザーでも機能しないものがあります。

4

5 に答える 5

4

ECMAScript 5 の開発の非常に遅い段階まで、引数オブジェクトはすべての Array.prototype メソッドを継承する予定でした。しかし、2009 年 9 月に TC39 によって承認された ES5 の「最終ドラフト」には、この機能がありませんでした。

2009 年 8 月、Apple の Oliver Hunt がこれを es5-discuss メーリング リストに投稿しました。

https://mail.mozilla.org/pipermail/es5-discuss/2009-August/003112.html

Arguments オブジェクトを WebKit の Array から継承させるロジックを先週の金曜日に実装したところ、すぐに
Prototype.js との深刻な非互換性が明らかになりました... これにより、少なくとも多くの Apple サイトと Nasa.gov が壊れます -- ..かなり主要なライブラリの主要な互換性の問題によって引き起こされたこれらのサイトの破損により、 配列のような動作を引数
に後付けしようとすることは実行不可能に思えます。

TC39 の残りのメンバーは Oliver の評価に同意し、この機能は最終ドラフトから削除されました。

おそらく、そのようなコードは、提案された ES5 ソリューションが今日機能するほど十分に Web から姿を消しました。ただし、ES6 の残りのパラメーターは問題に対するより優れた解決策であり、既存のコードとの後方互換性の問題が発生しない完全に新しい構文機能であるため、問題ではありません。

于 2012-11-02T05:30:01.793 に答える
1

arguments古いバージョンの Prototype や script.aculo.us を使用しているサイトなど、配列ではないことに依存しているサイトがオンラインにあります。これは、それを変更したブラウザ (ES4 にはこれが含まれており、9.5 から 10.10 まで Opera で使用されていた Futhark の他の多くの部分と共に実装された) は、これらのサイトを破壊することを意味し、市場では、サイトを破壊しないよう強く勧めています (任意の多くのサイトがめったに更新されないことを考えると、明らかな理由でそれらのサイトを気にするユーザーは、Web サイトを壊すブラウザを使用しません)。

于 2012-11-01T20:48:37.860 に答える
0

ECMAScript の次のバージョンでは、この問題 (およびその他のいくつかの問題) が残りのパラメーターで対処されています。

function foo(...rest) {
    console.log(rest.slice(1))
}

foo(1, 2, 3);

とは異なりarguments、残りのパラメーターは実数配列になるため、これは機能します。

残りのパラメーターはさらに多くのことを行うことができます。上記の例では、おそらく最初の引数を 1 つのものに使用し、その後のすべての引数を別のものに使用したいでしょう。代わりにこれを行うことができます:

function foo(first, ...rest) {
    console.log('first: ', first);
    console.log('rest: ', rest);
}

foo(1, 2, 3);

これはログに記録されます:

最初: 1

残り: [ 2, 3 ]

提案: http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters

于 2012-11-01T20:42:16.997 に答える