2012-05-08 7 views
0
/* 
* Example function for operating with dynamic arguments 
*/ 
function something(){ 
    for(var i in arguments){ 
     arguments[i] = arguments[i] + Math.random() * 25; 
    } 

    return arguments; 
} 

エラーはなく、パフォーマンス低下に気付かず、値が変更されます。動的引数で操作して返しても安全ですか?

動的引数に対してこのような操作を行うのは安全ですか?

答えて

3

実際の配列ではないので、返すことはありません(そのオブジェクトの特別な動作については、http://javascriptweblog.wordpress.com/2011/01/18/javascripts-arguments-object-and-beyond/を参照してください)。そのため、呼び出し元のコードによって何が行われるかによっては失敗します。

しかし、あなたは簡単に配列に変換することができます:

var args = Array.prototype.slice.call(arguments); 

変更はまた、あなたの関数は、いずれかを受け入れた場合に対応する名前付き引数を変更するので、私は、元のオブジェクトを変更しません。

0

argumentsは「疑似アレイ」です。配列を返すこととはどのように違うでしょうか?唯一の欠点は、argumentsは配列ではないため、必要な配列のプロパティとメソッドがないことです。

0

はい、安全です。ただし、argumentsオブジェクトの機能に注意する必要があります。これはEcmascriptの実装とバージョンによって異なります。引数変数に絶対にリンクされた擬似配列でも構いませんが、独立したArrayインスタンスにすることもできます。

あなたの環境を知っていれば、それはOKですが、このような場合にThiefMastersバリアントを使用する方が良いだろう、

function something() { 
    var l = arguments.length, 
     res = new Array(l); 
    for(var i=0; i<l; i++) { 
     res[i] = arguments[i] + Math.random() * 25; 
    } 
    return res; 
} 
+0

をコーディングする方が良いでしょうelsewhile。 – jolt

+0

とにかくこれらの値が必要ない場合は、なぜそれをコピーするのにsliceを使用しますか? http://jsperf.com/slice-vs-create – Bergi

+0

しかし、新しい配列を作成し、それらの値を動的に追加することは、ループ内を除いてsliceと同じです。ああ、前にjsperfのリンクに気付かなかった...興味深い。すべてのブラウザで高速になるでしょうか? – jolt

関連する問題