This question already has answers here:
Is JavaScript a pass-by-reference or pass-by-value language?
(30个答案)
3年前关闭。
假设我有一个对象为:
现在假设我将此对象分配给变量
然后
现在,将
问题1:如果变量(包括对象)在JavaScript中按值传递,那么为什么更改
另一个问题是分配给变量时,我无法更改对象的属性。考虑这种情况:
现在在控制台中键入
问题2:为什么不能使用变量更改对象的属性?
现在,对
(30个答案)
3年前关闭。
假设我有一个对象为:
var obj = {
len: 4,
bred: 5
}
现在假设我将此对象分配给变量
x
作为var x = obj;
。据我了解,它会创建obj
的副本,并将该副本分配给x
-按值传递。现在,如果我更改x
的属性,那么它也会同时更改obj对象的该属性。例如。x.len = 99
然后
obj.len
和x.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;
现在,对
x
或obj
属性的任何更改都将修改同一对象,因为它们将通过相同引用的副本。var obj2 = {
len: 4,
bred: 5
}
var x2;
x2 = obj.len;
len
是数字,而不是对象,因此该值不是引用。因此,当您复制它时,会得到数字的副本(而不是对象的引用副本)。09-16 18:20