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.len
和x.len
都变成了99
。另一方面考虑这种情况:
var r = 2, s = 3, t = 4;
s = r;
s = 88;
现在 r
按值传递给 s
,s
将 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
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;
对 x
或 obj
的属性所做的任何更改现在都将修改同一对象,因为它们经过同一引用的副本。
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
,另一方面,包含一个原语,所以它自己的值被复制了。
假设我有一个对象:
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
仍然会给出 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;
对 x
或 obj
的属性所做的任何更改现在都将修改同一对象,因为它们经过同一引用的副本。
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
,另一方面,包含一个原语,所以它自己的值被复制了。