重複の可能性:
配列内の変数への参照を格納するにはどうすればよいですか?
次のコードを検討してください。
var a = 'cat';
var b = 'elephant';
var myArray = [a,b];
a = 'bear';
myArray[0] は引き続き「cat」を返します。myArray[0] が「bear」を返すように、クローンの代わりに配列に参照を格納する方法はありますか?
重複の可能性:
配列内の変数への参照を格納するにはどうすればよいですか?
次のコードを検討してください。
var a = 'cat';
var b = 'elephant';
var myArray = [a,b];
a = 'bear';
myArray[0] は引き続き「cat」を返します。myArray[0] が「bear」を返すように、クローンの代わりに配列に参照を格納する方法はありますか?
myArray[0] = なんでも使うべきだと言っている他の人には同意しますが、達成しようとしていることを本当に達成したい場合は、配列内のすべての変数がオブジェクトであることを確認できます。
var a = {animal: 'cat'},
b = {animal: 'elephant'};
var myArray = [a, b];
a.animal = 'bear';
myArray[0].animal は「bear」になりました。
いいえ、JavaScript はそのように参照を行いません。
配列がオブジェクトへの参照を保持している場合でも、変数がまったく異なるオブジェクトを参照するようにしても、配列の内容は変更されません。
コードは、aが参照するオブジェクト変数を変更しません。これにより、変数はまったく別のオブジェクトを参照するようになります。
JavaScriptコードと同様に、次のJavaコードは機能しません。これは、JavaScriptと同様に、Javaがオブジェクトへの参照を値で渡すためです。
Integer intOne = new Integer(1);
Integer intTwo = new Integer(2);
Integer[] intArray = new Integer[2];
intArray[0] = intOne;
intArray[1] = intTwo;
/* Make intTwo refer to a completely new object */
intTwo = new Integer(45);
System.out.println(intArray[1]);
/* output = 2 */
Javaでは、(変数に新しい参照を割り当てる代わりに)変数によって参照されるオブジェクトを変更すると、希望する動作が得られます。
例:
Thing thingOne = new Thing("funky");
Thing thingTwo = new Thing("junky");
Thing[] thingArray = new Thing [2];
thingArray[0] = thingOne;
thingArray[1] = thingTwo;
/* Modify the object referenced by thingTwo */
thingTwo.setName("Yippee");
System.out.println(thingArray[1].getName());
/* output = Yippee */
class Thing
{
public Thing(String n) { name = n; }
private String name;
public String getName() { return name; }
public void setName(String s) { name = s; }
}
いいえ、それは不可能です。JavaScript はそのような参照をサポートしていません。
オブジェクトのみが参照として保存されます。しかし、私はそれがあなたがここで望んでいるものとは思えません。
あなたは一種のあなた自身の質問に答えました。myArray[0] を bear に等しくしたい場合は、次のように設定します。
myArray[0] = "bear";