我已经读过变量在js中存储为内存引用。
因此,对于var a = 5
,值5
的内存位置已分配给a
。
我尝试在node.js上运行它:
var a = 5;
var b = {
val: a
};
a = 6;
我希望b.val
为6
,但5
,
如果我跑:
var a = 5;
var b = {
val: a
};
var c = {
value: b
}
b.val = 6;
比c.value.val
6
。
如果它们都是内存对象,为什么输出会有差异?
答案 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中,只有对象是引用更多内存(特别是它们各自的属性)的值,并且传递这样的引用值将始终引用同一组属性(“对象”) 。所有其他值 - 所谓的原始值 - 只是不可变的值,没有引用。