1.値渡し(値渡し)
変数の値はコピーされ、元の値とは関係ありません。つまり、新しい値が変更されても、元の値は変更されません。JavaScript では、基本的な型は値によって渡されます。
次のようにコードをコピーします。
関数 testPassValue()
{
変数m=1;
変数n=2;
//mとnの値をコピーしてpassValueに渡す
passValue(m,n);
alert(m); //元の値になります
}
関数 passValue(a,b)
{
a = a+b; //a の値を変更します。ここでの a は元の値の単なるコピーです。
アラート(a);
}
出力結果:
3
1
2. 参照により。
参照自体のコピーは関数に渡されますが、オブジェクトの属性の値が変更された場合、参照が指すオブジェクトはコピーされて渡されません。参照は同じオブジェクトを指しているため、変更された値は元の参照を通じてアクセスされます。
ただし、関数内で新しいオブジェクトへの参照を指定しただけの場合、元のオブジェクトの値は変更されず、コピーされた参照のみが変更されます。
次のようにコードをコピーします。
関数 testPassValue()
{
var date = 新しい日付(2006,02,27);
alert(date.getDate()); //出力は 27 です
//日付参照自体をコピーし、それを passReference に渡します。date が指すオブジェクトはコピーされていないことに注意してください。
passReference(日付);
alert(date.getDate()); //出力は 12 です
//同上
変更参照(日付);
alert(date.getDate()); //出力は 12 のままです。
}
関数 passReference(da)
{
//da と元の参照は同じオブジェクトを指しているため、関数の外では、元の参照を通じてアクセスされるのはオブジェクトの date 属性値であり、これが変更された値になります。
da.setDate(12);
}
関数changeReference(da)
{
//現時点では、da 参照は実際には元の参照のコピーです。参照自体を再割り当てしても、元の参照には影響しません。
da= 新しい日付(2007,05,11);
//da 参照が新しいオブジェクトを指すようにします。この時点では、元の参照は依然として元のオブジェクトを指します。
alert(da.getDate()); // 出力は 11 です
}
3 特別な文字列
JavaScript でも String は参照渡しされます。js には charAt メソッドしかありませんが、Java の String と同じであり、不変性があります。
次のようにコードをコピーします。
var s1 = "こんにちは";
var s2 = "地獄" + "o";
if (s1 == s2)
alert("s1 = s2"); //この文は実行されますか? Java に詳しい人は、この文は実行されないと思うかもしれません (私はこの文を非常に批判しています。これは Java でも実行されます!)。 java の == は同一性を比較します。実際、js では String== が値が等しいかどうかを比較します。しかし、他の Object == 比較については Java と同じです。