3

関数argumentsプロパティ(Mozillaが「配列のような」プロパティと呼ぶもの)の個々の要素を設定することは可能ですが、これは1.6で修正されていますが、MozillaはSpiderMonkey1.5でこのプロパティに要素を追加することはできないと報告しています(参照ここでSpiderMonkeyに注意してください... https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments)。

これは便利なプロパティであり、サブクラスからコンストラクターをチェーンしたり、関数(たとえばmyclassmethod.apply(this, arguments))に渡す引数のリストを作成したりします。

ただし、MozillaがSpiderMonkey 1.5について報告しているのと同じように、V8では長さが延長されないことがわかりました。(他のJavaScriptエンジン、Opera、Rhinoなどのステータスがわからない)。

これは実際にはECMA機能ですか?Mozillaはこれをバグと見なすのに誤りがありますか、それともV8には修正すべきバグがありますか?

[更新]V8を使用すると、arguments.lengthプロパティを割り当てることができるため、効果的argumentsに拡張できます(または、必要な長さに設定できます)。ただし、JSLintはこれが悪い割り当てであると文句を言います。

[更新]OperaやFFなどでこれを試したい場合は、テストコードargumentsで、サブクラスコンストラクターに要素を追加し、スーパークラスコンストラクターを呼び出しながら、1つの引数でコンストラクターを呼び出すサブクラスのインスタンスを作成します。スーパークラスはレポートする必要があります。 2つの引数:

function MyClass() {
    if (arguments.length) {
        console.log("arguments.length === " + arguments.length);
        console.log("arguments[0] === " + arguments[0]);
        console.log("arguments[1] === " + arguments[1]);
    }
}

function MySubClass() {
    console.log(arguments.length);
    //arguments.length = 2;  // uncomment to test extending `length' property works
    arguments[1] = 2;
    MyClass.apply(this, arguments);
}

MySubClass.prototype = new MyClass();

new MySubClass(1);

arguments[更新]JSLintは、ルックス(たとえば)によって何らかの割り当てを行うと、実際に文句を言いますarguments[0] = "foo"。したがって、おそらくJSLintにはここでもやるべきことがいくつかあります。

4

3 に答える 3

3

これが探しているものかどうかはわかりませんが、argumentsオブジェクトを標準の配列にすることができます。

var args = [].slice.call(arguments, 0);

[編集]あなたができるように:

myclassmethod.apply(this, [].slice.call(arguments, 0).push(newValue));
于 2012-04-24T13:48:37.700 に答える
0

ECMA-262 10.1.8argumentsは、オブジェクトのプロトタイプがObjectプロトタイプであり、arguments「初期値」というフレーズを使用して、オブジェクトが特定の方法で初期化されることを示しています。したがって、そのプロパティのいずれかを必要なものに割り当てることができるように思われます。それが正しい解釈かどうかはわかりませんが。

于 2012-04-24T14:19:54.543 に答える
0

OK、これで結論を出すことができると思います。

上記のサンプルコードをFF、Comodo Dragon、Opera、IE(すべて現在のバージョン、Windoze)で実行するとarguments.length、(Mozillaのフレーズとして、「配列のような」)arguemntsオブジェクトのサイズを変更するためのプロパティの変更がすべて受け入れられます。配列に通常のように値を割り当てることによってサイズを増やすものはありません(つまり、arguments[arguments.length] = "new arg")。

javascriptエンジンのコンセンサスは、「配列のような」オブジェクトは配列のようargumentsに動作するが、それ以外の場合はいくつかの驚きを投げかける傾向があるということのようです;)いずれにせよ、ECMA標準の解釈はそれに直面しているように見えます少なくとも全面的に一貫しているため、セマンティクスは実際には問題ではありません(理由と理由が唯一の残りの質問ですが、歴史的な関心のみです)。

MSDNもMozillaもこれを文書化していないようです(V8またはOperaがJSドキュメントをどこに隠しているかはわかりません)。その時点で私はお辞儀をしますが、誰かがいつか関係者にヒントを機会に落とすことができれば、それは時々使用するのに便利なテクニックです。

この質問をご覧いただきありがとうございます。

[更新]BishopZは、とにかく一連の引数を取ることを上で指摘しまし.applyた(これは、私が何年も前に最後に使用して以来、私の心を滑らせ、私の問題を解決します)。ただし、「配列のような」argumentsは引き続き使用でき、状況によっては望ましい場合もあります(たとえば、値をスーパークラスにポップしたり、引数をスーパークラスに渡したりする方が簡単です)。問題をご覧いただきありがとうございます。

于 2012-04-24T23:26:12.617 に答える