variables/objects 是按值传递的吗?为什么我不能用 javascript 中的变量更改对象的 属性?

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

假设我有一个对象:

var obj = {
        len: 4,
        bred: 5
    }

现在假设我将此对象分配给变量 x 作为 var x = obj;。据我了解,它创建了 obj 的副本并将该副本分配给 x —— 即按值传递。现在,如果我更改 x 的 属性,那么它也会更改 obj 对象的 属性。例如

x.len = 99

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

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

现在 r 按值传递给 ssr 的副本提供给 s。因此,将 s 更改为 88 不会更改 r 变量的原始值。在控制台中输入 r 仍然会给出 2.

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

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

var obj2 = {
        len: 4,
        bred: 5
    }
var x2;
x2 = obj.len;

现在只需在控制台中输入 x2 returns 4。但是,如果我尝试更改 x2 的值,例如 x2 = 77;,则不会更改 obj2.len.

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

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

// 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 的属性所做的任何更改现在都将修改同一对象,因为它们经过同一引用的副本。


var obj2 = {
    len: 4,
    bred: 5
}
var x2;
x2 = obj.len;

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

原始类型(字符串、数字、布尔值、null、undefined 和符号)按值传递;对象也按值传递,但传递的值是它们的引用。

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 的引用值的副本。 x 然后指向 obj。通过任一引用所做的修改将修改同一对象。

obj.len,另一方面,包含一个原语,所以它自己的值被复制了。