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

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

本文关键字:变量 对象 属性 javascript 不能 是否 按值传递 为什么      更新时间:2023-09-26

假设我有一个对象为:

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按值传递给ss r的副本已提供给s。因此,将s更改为88不会更改变量r原始值。在控制台中键入r仍然会给出 2 .

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

另一个问题是,在分配给变量时,我无法更改对象的属性。请考虑以下方案:

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

现在在控制台中键入 x2 只会返回 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 和符号)按值传递;对象也按值传递,但传递的值是它们的引用值。

据我了解,它创建了一个 obj 的副本并将该副本分配给 x - 这是按值传递的。

否,x被分配了对 obj 的引用值的副本。 然后x指向obj 。然后,通过任一引用进行的修改将修改同一对象。

另一方面,obj.len包含一个基元,因此复制了自身的值。