ある変数の値を他の変数へ代入すると、その内容が代入先へコピーされます。

var x=50;
var y;
y= x; //xの値をyにコピー
x= x+10;
$.writeln ("x="+x); //x=60
$.writeln ("y="+y); //y=50

 

あたりまえのように聞こえますが、すべての変数がそうなるわけではありません。例えば、以下のようなオブジェクトが代入されている変数の内容はコピーされません。 

//カード型データベースもどき(失敗例)
var profile= { 
    firstName: "",
    familyName: "",
    age: undefined
}
var cards= [];
//1枚目のカード
cards[0]= profile; //コピーした"つもり"
cards[0].firstName= "1000p";
cards[0].familyName= "Nakatoji";
cards[0].age= 100;
//2枚目のカード
cards[1]= profile; //コピーした"つもり"
cards[1].firstName= "3p";
cards[1].familyName= "Hiratoji";
cards[1].age= 105;
//テスト
$.writeln (cards[0].firstName); //結果:"3p"
$.writeln (cards[1].firstName); //結果:"3p"
$.writeln (profile.firstName); //結果:"3p"

変数の内容がコピーされていれば、最後にコンソールへ書き出される値はそれぞれ違うはずです。しかし、そうはならずにcards[0]もcards[1]も同じ値になります。これは変数への代入が「参照渡し」になるからです。

 

「参照渡し」とは、変数の値が代入されずに「値が収納されている場所」が代入されるというもので、常にオリジナルの値が参照され、内容の書き換えもオリジナルのオブジェクトに行われます。

上の例のコンソールへの書き出しを見れば、変数cards[0]、cards[1]のみならず、オリジナルの「profile」も書き換えられているのがわかります(最終行)。

 

なのでオブジェクトをコピーしたい場合は、それを前提としたオブジェクトづくりが必要になります(参照:オブジェクトをコピーする)。

 

 

Joomla templates by a4joomla