2011-01-20 88 views
3

是否有可能为一个变量指向另一个在这样的阵列,一个变量可能指向另一个变量吗?

var theArray = [0,1,2,3]; 
var secondElement = //somehow point to theArray[1] 

使得如果我修改theArray[1]secondElement还应当修改,反之亦然(可能的话,不使用函数)?

回答

2

你在问关于引用 - 对于原始值,它不是直接可能在Javascript中。这是可能的W/R/T对象:

C:\WINDOWS>jsdb 
js>a = [] 
js>b = {refToA: a} 
[object Object] 
js>b.refToA.push(3) 
1 
js>a 
3 
js>a.push(4) 
2 
js>b.refToA 
3,4 
js> 

在上面的例子中,对象b有一个属性refToA它包含对象a;两者都引用相同的实际对象,因此对象b.refToAa的更改通过访问它的两种方式反映出来。如果您重新指定b.refToAa,则此参考被破坏。类似地使用数组:

js>x = {y: 3, toString: function() { return 'y='+this.y; }} 
y=3 
js>a = [x] 
y=3 
js>b = [3,x] 
3,y=3 
js>a[0].y = 22 
22 
js>b 
3,y=22 
js>b[1].y = 45 
45 
js>a 
y=45 

a[0]b[1]都有一个值,该值是相同的附图中的对象。

只有当共享对象是一个可变容器时,才能实现您正在查找的效果,以便您的两个所需变量具有(并且始终具有)相同的值,这是对共享可变容器的引用。您可以更改容器中的值,并且可以通过两种访问方式查看它们。原始值(例如数字和字符串)不是可变容器,因此它们不能以这种方式使用。

+0

是的。这是我从C++引用中遗漏的那些东西之一。但是由于我大部分的函数代码都是一个封装对象,我现在已经使用了getter和setter .. var obj = {0} {1} [1,2,3], get secondElement(){ return this.a [0]; (){ }返回this.secondElement; } } 我知道getters是“特殊功能”,但他们肯定看起来很干净! – Manu 2011-01-20 15:32:43

3

没有办法直接做到这一点。该数组可以是一个对象数组,您可以直接修改对象的属性而不是数组条目。然后,你将有:

var theArray = [ { value: 0 }, { value: 1 }, { value: 2 }, { value: 3 } ]; 
var secondElement = theArray[1]; 

然后改到theArray[1].value也将是可见的secondElement.value

我会提供的观察,功能是友好的事情,他们不会伤害你,如果你不尝试和尾巴拿起来。

3

您可以使用对象的属性和与对象包装你的数组:

var a = {arr: [1,2,3,4]}; 
var b = a; 
b.arr[0] = 777; 
console.log(a.arr); 

这种方法的优点是,你还可以指定新值都a.arrb.arr

var a = {arr: [1,2,3,4]}; 
var b = a; 
a.arr = [777,888]; 
console.log(b.arr); 
+0

这是我最初的想法。但是我有很多这些,并有许多重复的对象搞乱了代码。 – Manu 2011-01-20 14:49:12

相关问题