是一个存储为javascript内存参考的变量?

时间:2016-03-02 16:59:46

标签: javascript

我已经读过变量在js中存储为内存引用。

因此,对于var a = 5,值5的内存位置已分配给a

我尝试在node.js上运行它:

var a = 5;
var b = {
  val: a
};
a = 6;

我希望b.val6,但5

如果我跑:

var a = 5;
var b = {
  val: a
};
var c = {
  value: b
}
b.val = 6;

c.value.val 6

如果它们都是内存对象,为什么输出会有差异?

2 个答案:

答案 0 :(得分:8)

在javascript中,当您将object分配给另一个variable时,其memory reference将被共享。它不会创建副本。与此同时,primitive values将与此完全相反。当它被分配给另一个variable时,它将创建一个副本。

你还要注意这种奇怪的情况,

var x = { a: 10 };
var y = x;
x = 5;

初看一下,在听到关于对象的基本解释后,每个人(新学员)都会说,y将包含5。但这是错误的。 y将具有较旧的值,即{a:10}。因为在此上下文中,x的旧引用将被截断,并且将为新内存位置分配新值。但是Y将保留x给出的引用。

答案 1 :(得分:2)

  

我已经读过变量在js中存储为内存引用。

嗯,是的,所有变量基本上都是对内存的引用 - 在所有语言中。

  

因此,对于var a = 5,值为5的内存位置将分配给。

我会说“将值5写入名为a的内存位置。”

  

我希望b.val为6但是5

怎么样? … val: a …表示“从内存位置获取名称为a的值,并使用它创建名为val的属性。存储在那里的值为5

在JavaScripts中,只有对象是引用更多内存(特别是它们各自的属性)的值,并且传递这样的引用值将始终引用同一组属性(“对象”) 。所有其他值 - 所谓的原始值 - 只是不可变的值,没有引用。