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