【问题标题】:Set value to a referenced JavaScript object将值设置为引用的 JavaScript 对象
【发布时间】:2016-02-01 22:37:48
【问题描述】:

例如,我有以下 JS 对象:

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.n 的值更改为nGlobal,而不提obj
就像这样:

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

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

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

【问题讨论】:

  • JavaScript 是按值传递,而不是按引用传递。为变量赋值永远不会改变另一个变量或属性的值(例外:全局范围和with)。
  • @FelixKling 或者更确切地说,对于基元:按值传递和非基元:按引用传递
  • @Tushar:不,对象被表示为 引用,但这与 pass-by 引用无关。引用传递和值传递是指变量和参数如何相互关联。这与他们持有的价值观无关。

标签: javascript reference variable-assignment javascript-objects


【解决方案1】:

简答:

不,没有。

长答案:

  1. 在 JS 中,原始类型是不可变的,并且通过值传递。
  2. JS 实现了传值策略,这意味着所有的数据总是传值(如果你传对象的引用——引用传值)

上述项目的一个重要后果是:在 JS 中,无法使用 = 操作更改原始对象。也就是说:当你有一个对象的引用时,你可以修改它,但你不能将一个对象与其他对象交换,以便所有其他引用也“被修改”。

相关:

学分:

【讨论】:

  • 我知道你的意思,但我认为仍然认为这不应该混为一谈。例如,您的回答可以解释为如果obj.n 是一个对象,nGlobal = someNewObject 会神奇地起作用(但当然不会)。我想这里更重要的是原始值是不可变的。
  • @FelixKling 第二次尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2020-11-24
  • 2012-10-25
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多