0

例如,我有以下的JS對象:設定值引用的JavaScript對象

var obj = { 
    n: 0, 
    o: {} 
}; 

var nGlobal = obj.n; 
var oGlobal = obj.o; 

,並希望使用全局變量,以使它看起來像這樣:

var obj = { 
    n: 5, 
    o: { 
     x: 7 
    } 
}; 

顯然,我可以爲屬性oGlobal分配一個值:

oGlobal.x = 7; 

但是,有什麼方法可以改變obj.nnGlobal的值,沒有提到obj
只是這樣的事情:

console.log(obj); // {n: 1, o: {}} 

nGlobal.set(5); 
// or 
nGlobal.value = 5; 

console.log(obj); // {n: 5, o: {}} 
+0

JavaScript是通過按值,無法通過按引用。賦值給變量永遠不會改變另一個變量或屬性的值(例外:全局作用域和'with')。 –

+0

@FelixKling更確切地說,對於基元:通過值和非基元:通過引用 – Tushar

+1

@Tushar:不,對象被表示爲**引用,但與**通過無關-引用。傳遞引用和傳遞值是指變量和參數如何相互關聯。它與他們所持有的價值無關。 –

回答

2

簡短的回答:

沒有,沒有。

龍答:

  1. 在JS基本類型是不可變的和值通過。
  2. JS器具通過按值的策略,這意味着所有的數據總是由值傳遞(在情況下,如果傳遞一個參考對象 - 基準是值傳遞)

一個重要來自上述項目的後果:在JS中,無法使用=操作更改原始對象。即:當你有一個引用時你可以修改一個對象,但是你不能用另一個對象來交換一個對象,這樣所有其他引用也會被「修改」。

相關:

現金:

+0

這實際上與數據類型沒有任何關係...... –

+0

我知道你的意思,但我認爲仍然認爲這不應該混淆。例如,你的答案可以解釋爲,如果'obj.n'是一個對象,'nGlobal = someNewObject'會神奇地工作(但當然不會)。我猜這裏更重要的是原始值是不可變的。 –

+0

@FelixKling第二次嘗試 – zerkms