关于html:变量/对象是否按值传递,为什么我不能在javascript中使用变量更改对象的属性?

Are variables/objects passed by value and why can't I change object's property with variable in javascript?

本问题已经有最佳答案,请猛点这里访问。

假设我有一个对象:

1
2
3
4
var obj = {
        len: 4,
        bred: 5
    }

现在假设我将这个对象分配给一个变量x,作为var x = obj;。据我所知,它创建了一个obj的副本,并将该副本分配给x?-?这是传递值。现在,如果我更改EDOCX1的属性(0),那么它也会更改obj对象的属性。例如。

1
x.len = 99

然后,obj.lenx.len都变成99。另一方面,考虑这种情况:

1
2
3
var r = 2, s = 3, t = 4;
s = r;
s = 88;

现在,r按价值传递给sss提供了r的副本。因此,将s改为88并不改变r变量的原值。在控制台中键入r仍然会得到2

问题1:如果变量(包括对象)在javascript中按值传递,那么为什么更改x.len也会更改原始obj.len

另一个问题是,当分配给变量时,我不能更改对象的属性。考虑这种情况:

1
2
3
4
5
6
var obj2 = {
        len: 4,
        bred: 5
    }
var x2;
x2 = obj.len;

现在在控制台中键入x2只返回4。但如果我试图改变x2的值,比如x2 = 77;,那么这不会改变obj2.len

问题2:为什么我不能用变量更改对象的属性?


所有东西都是按值传递的,但是当您创建一个对象时,会得到对该对象的引用。

1
2
3
4
5
6
7
// Create an object. Assign a reference to that object to `obj`
var obj = {
    len: 4,
    bred: 5
};
// Copy the value of `obj` to `x`. Now `x` is also a reference to that object.
var x = obj;

xobj的属性所做的任何更改现在都将修改同一对象,因为它们会浏览同一引用的副本。

1
2
3
4
5
6
var obj2 = {
    len: 4,
    bred: 5
}
var x2;
x2 = obj.len;

len是一个数字,不是一个对象,因此该值不是一个引用。所以当你复制它时,你会得到一个数字的副本(而不是对象引用的副本)。


基元类型(字符串、数字、布尔值、空值、未定义和符号)通过值传递,而对象则通过引用传递。

As far as I understand it, it creates a copy of obj and assign that copy to x -- that is pass by value.

不,x被分配了对第一个分配给obj的对象的引用。它是同一个对象,因此在xobj上都会更新。

另一方面,obj.len包含一个原始值,因此它是复制的,而不是引用的。