2013-09-26 23 views
2

我希望能有兩個引用相同的原始值,並且經由一個完成的任何變化應該反映到其他的「神奇」 - 即,使用C代碼作爲一個例子:Javascript:兩個引用同一個原語,同時改變?

// (C code): 
int value = 0; 
int *p1 = &value; 
... 
int *p2 = &value; 
*p2 = 1; 
... 
printf("%d", *p1); // gives 1, not 0 

唯一到目前爲止,我已經找到了通過使用額外對象間接尋址的方法:

var a = { valueWrapper: { num: 1, str: 'initial' } }; 
var b = a; 

// change a 

a.valueWrapper.num = 2; 
a.valueWrapper.str = 'changed'; 

// show b 

console.log(b.valueWrapper.num); 
console.log(b.valueWrapper.str); 

// outputs: 
// 
// $ node test.js 
// 2 
// changed 

有沒有更簡潔的方法?

+0

你'valueWrapper'中間人。如果一個對象字面值被賦值給'a'並且'a'被賦值給'b',那麼這兩個變量將共享一個對同一個對象的引用。 –

+0

但是,我對基元提出了問題:「兩個引用同一個基元」。 – angularJsNewbie

+0

事實上,但是'a = {num:1,str:「initial」}'會有什麼錯?兩個基元都將在所有引用與'a'相同的對象的變量之間共享。換句話說,你只需要一個包裝。 –

回答

2

在Javascript原始類型,如整數和字符串按值傳遞。沒有建立方法來改變這一點。

可以擺脫「valueWrapper」的,如果它不是由設計:不需要

var a = {num : 1, str : "initial"}; 
var b = a; 
a.num = 2; 
console.log(b.num); // display 2 
0

只有一種情況 - 參數和函數參數對象 - 它們即使在值爲原始類型時也會奇蹟般地相互改變(這在嚴格模式下不起作用)。

function magicLink(a,b) { 
     arguments[0] = 5; 
     arguments[1] = 10; 
     console.log([a,b]); 
    } 

    magicLink(1); // [5, undefined] 

這隻適用於在調用期間設置的參數。

+0

你能提供一個例子嗎? – angularJsNewbie

+0

@angularJsNewbie你在這裏;) – magyar1984