Lai*_*uan 6 javascript reference variable-assignment
基本的例子:
var b = 10;
var c = b;
b++;
console.log(b,c);
>> 11 10
Run Code Online (Sandbox Code Playgroud)
c看起来像是副本b.
但在另一个案例中:
var x = {};
var y = x;
x.abc = 10;
console.log(x.abc, y.abc);
>> 10 10
Run Code Online (Sandbox Code Playgroud)
为什么y不是副本x,而是指向同一实例的引用x指向?
此外,我猜测b++创建了另一个实例,因此b指向新实例但c指向旧实例.然而...
var u = 10;
setTimeout(function() {
console.log(u);
}, 10000)
u++;
>> 11
Run Code Online (Sandbox Code Playgroud)
如果u++创建一个新实例,那么u匿名函数里面应该指向旧的u,不应该吗?
Ada*_*kis 10
分配基元时,它们按值分配; 引用类型(如您的对象)是通过引用分配的(或者,当Jon Skeet更正我时,它们会被分配一个引用的副本).
在你的第二个例子中,x和y都指向内存中的同一个对象.这就是为什么将abc属性添加到一个属性,也将其添加到另一个属性
您还会观察到将x或y传递给函数的相同行为
function addABC(foo) {
foo.abc = 10;
}
var x = {};
var y = x;
addABC(x);
console.log(x.abc, y.abc);
Run Code Online (Sandbox Code Playgroud)
请注意,虽然x和y指向内存中的同一个对象,但它们是引用的单独副本,所以这个
var x = { a: 1 };
var y = x;
y = {};
alert(x.a);
Run Code Online (Sandbox Code Playgroud)
还有这个
var x = { a: 1 };
var y = x;
x = {};
alert(y.a);
Run Code Online (Sandbox Code Playgroud)
仍会提醒1.
Que*_*tin 10
在
c貌似副本b.
两者都引用了相同的不可变值.
为什么
y不是副本x而是指向实例x指向的引用?
x首先是对象y的引用,它是它的副本(引用的副本,而不是对象的副本).
如果
u++创建一个新实例,
它没有.
该
u匿名函数应指向旧的u,不应该吗?
u++指定11到11的引用u.匿名函数正在查看u而不是" u创建函数时的值".
这个说法:
var y = x;
Run Code Online (Sandbox Code Playgroud)
复制的值x作为的初始值y。但是,涉及的值是对对象的引用,而不是对象本身。请注意,这并不等于说,即转让副本“为参考x” -它确实是值的x。因此,尤其是如果您更改的值x以引用不同的对象,例如
x = "something else";
Run Code Online (Sandbox Code Playgroud)
那么这将不会更改-的值y-其值仍将是对原始对象的引用。