2012-06-12 19 views
5

なぜ2つのスクリプトが異なるのですか?私が望むのは第1のスクリプトですが、第2のdrawData()ではデータが変わります。変です。誰が私にそれがなぜ、どのようにそれを修正するかを教えてもらえますか?ありがとうございました!JavaScript関数の配列を変更すると、配列が関数の外に変更されますか?

var data =   ["right"] ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs[0]="omg"; 
    } 
    alert(data[0]); 

} 
drawData(data); 
drawData(data,"percentage"); 

2: - ので、この変化は関数の外に見られる

var data =   "right" ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs="omg"; 
    } 
    alert(data); 

} 
drawData(data); 
drawData(data,"percentage"); 
+4

オブジェクト自体であるためです。オブジェクトが変更されたとき*オブジェクトが変更されたとき。値(オブジェクト)が関数に渡されると**コピー、クローン化、または複製**されません(内部的には、使用されるさまざまなテクニックがありますが、意味的には正しい)。つまり、配列は1つしかなく、関数内で* same *配列が変更されます。外部に影響を及ぼす恐れなしに変更できるようにしたい場合は、まずコピーを作成してください。単純な配列の場合、これは 'Array.prototype.slice'で行うことができます。それ以外の場合、jQueryのようなライブラリには便利なコピーメソッドがあります。 –

+0

ああ、回答してください** ** "合格基準"と言う前に、[評価戦略](http://en.wikipedia.org/wiki/Evaluation_strategy)を読んで、 [ECMAScriptの仕様書](http://es5.github.com/)を使用して、あなたの言葉の選択肢をバックアップすることができます。ありがとう! –

+1

ありがとう、私は何か興味深いが見つかりました[http://stackoverflow.com/](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone- a-javascript-object)John Resigの答えを見てください。 –

答えて

0

最初の変異体は、(配列であることを起こる)関数にパラメータとして渡されたオブジェクトを修正します。 2番目の変種は関数パラメータ(配列を参照することになります)に新しい値を割り当てますが、配列自体は変更しません。

+1

この質問では、応答があまりにも不明瞭であり、不明瞭であり、「この配列への参照が変更されました」という定義が不適切な用語を使用していますか?また、スコープ(ローカル変数の代入)とオブジェクトの変更可能性(オブジェクトへのプロパティの割り当て)が混在しています。 –

関連する問題