This question already has answers here:
Is JavaScript a pass-by-reference or pass-by-value language?
                                
                                    (30个答案)
                                
                        
                3年前关闭。
            
        

假设我有一个对象为:

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

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

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

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


现在在控制台中键入obj.len只需返回x2。但是,如果我尝试更改4的值(例如x2),则不会更改x2 = 77;

问题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是数字,而不是对象,因此该值不是引用。因此,当您复制它时,会得到数字的副本(而不是对象的引用副本)。

09-16 18:20