Javascript的赋值操作是复制引用?

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创建函数时的值".


Jon*_*eet 5

这个说法:

var y = x;
Run Code Online (Sandbox Code Playgroud)

复制的值x作为的初始值y。但是,涉及的值是对象的引用,而不是对象本身。请注意,这并不等于说,即转让副本“为参考x” -它确实是x。因此,尤其是如果您更改的值x以引用不同的对象,例如

x = "something else";
Run Code Online (Sandbox Code Playgroud)

那么这将不会更改-的值y-其值仍将是对原始对象的引用。

  • @AdamRackis:他以前把脚趾浸在这个池塘里。 (3认同)