2011-01-20 100 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