2017-04-26 46 views
0

想知道如果變量是一個字符串是否可以更新對象引用變量?它工作,如果我分配整個對象,但不適用於字符串。我也可以指定整個對象,但這裏的問題是我不需要一個對象,但是我需要一個字符串,因爲它是Angular 2服務的全局變量。更新引用變量

https://jsfiddle.net/009kqqrt/

obj = { var: 'initial' }; 
a = [{ test: 'old', new: 'no' }, { test: obj.var, new: 'yes' }]; 
o = { test: obj.var, new: 'yes' }; 

obj.var = 'objModified'; 

alert(o.test); // Changes correctly 

obj.var = 'arrModified'; 

alert(a[1].test); 

這裏是的jsfiddle。

預期的結果將是 -

第一警報 - 'objModified' 第二個警告 - 'arrModified'

在我的情況,我總是得到 '初始'。

回答

0

我想你想要做的是通過對象引用

var obj = { var: 'initial' }; 
var a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; 
var o = { test: obj, new: 'yes' }; 

obj.var = 'objModified'; 

alert(o.test.var); // Changes correctly 

obj.var = 'arrModified'; 

alert(o.test.var); 

更新小提琴:https://jsfiddle.net/echonax/009kqqrt/2/

如果你傳似,字符串參考test: obj.var因爲字符串是不可變的,它不會改變。

+0

好的,如果沒有將參數傳遞給對象,那麼就不可能更改該值? –

+0

@VdasDorls你可以迭代數組並手動改變它 – echonax

0

這就是你寫的一個Ø對象的時間基準的obj.var值在創建時。

創建後對該值的任何更改都不會傳播到a

如果您希望它以這種方式工作,您將需要使測試屬性引用一個對象,而不是直接引用該值。

obj = { var: 'initial' }; 
a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; 
o = { test: obj, new: 'yes' }; 

obj.var = 'objModified'; 

alert(o.test.var); // o.test=== obj is true 

obj.var = 'arrModified'; 

alert(a[1].test.var); // a[1].test=== obj is true 
0

當創建陣列a和對象o,屬性test初始化用一個簡單的字符串變量的值,所以他們的值存儲「爲值」。

obj = { var: 'initial' }; 
a = [{ test: 'old', new: 'no' }, { test: obj.var, new: 'yes' }]; 
o = { test: obj.var, new: 'yes' }; 

如果初始化與對象引用,比如下面的例子:

var obj = { var: 'initial' }; 
 
a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; 
 
o = { test: obj, new: 'yes' }; 
 

 
obj.var = 'objModified'; 
 
console.log(o.test.var); 
 
obj.var = 'arrModified'; 
 
console.log(a[1].test.var);

你可以看到,當被引用的對象被修改他們的價值會修改,這是因爲他們的價值是通過參考存儲的。

我希望很清楚,再見。