2011-01-20 3 views
3

することにより、一つの変数は、私はtheArray[1]を変更した場合、secondElementも(関数を使用せずに、おそらく)修飾およびその逆されるべきであるように、このようなアレイ内の別ある変数が別の変数をポイントすることは可能ですか?

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

を指すようにするためですか?

答えて

2

原始的な値については、Javascriptでは直接使用できません。それは/ R/TオブジェクトW可能である:上記の例で

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オブジェクトaを含むプロパティrefToAを有します。どちらも同じ実際のオブジェクトを参照するため、オブジェクトb.refToAaへの変更は、両方の方法で反映されます。 b.refToAまたはaのいずれかを再割り当てすると、この参照が破損します。同様にアレイを有する:

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]両方のオブジェクトに対して同一の参照値を持っています。

あなたが探している効果は、共有オブジェクトが変更可能なコンテナである場合にのみ達成できます。そのため、2つの必要な変数が共有可変コンテナへの参照である同じ値を持ちます(常にあります)。コンテナ内の値を変更することができます。両方のアクセス方法で値が表示されます。プリミティブ値(数字や文字列など)は可変コンテナではないため、このように使用することはできません。

+0

真。これは、私がC++のリファレンスから逃しているものの1つです。しかし、私は関数コードの大部分をカプセル化するオブジェクトを持っているので、私はゲッターとセッターを使っています。 var obj = { a:[1,2,3]、 get secondElement(){ return this.a [0]; }、 toString:function(){ return this.secondElement; } } getterは「特別な機能」ですが、きれいに見えます。 – Manu

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

関連する問題