变量/对象是否按值传递,为什么我不能在 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
只会返回 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 和符号)按值传递;对象也按值传递,但传递的值是它们的引用值。
据我了解,它创建了一个 obj 的副本并将该副本分配给 x - 这是按值传递的。
否,x
被分配了对 obj
的引用值的副本。 然后x
指向obj
。然后,通过任一引用进行的修改将修改同一对象。
另一方面,obj.len
包含一个基元,因此复制了自身的值。
- 替换另一个变量对象中的变量值
- 如何从表单变量对象中获取特定的from属性
- 变量/对象是否按值传递,为什么我不能在 javascript 中使用变量更改对象的属性
- 执行上下文和变量对象在 JavaScript 中实际上是一回事吗?
- 如何将变量对象传递到多个javascript弹出窗体
- 如何将javascript变量/对象从一个页面传递到另一个页面
- 在具有递增的变量/对象中存储和控制传单 GeoJSON 图层
- 在回调中重用变量/对象
- 给一个有1个变量/对象的函数给定几个参数
- 使用单词'英语'因为变量/对象名称在javascript中不起作用
- 如何访问变量对象中的数据
- 使用onclick调用变量对象中的函数
- 使用Underscore JS部分和for循环的未定义变量对象
- 如何查看我的变量对象
- 变量对象属性名称作为javascript中的参数
- 从变量对象中移除DOM元素,以便将其发布到服务器
- 根据变量对象是否等于“true”输出内容
- 如何连接(变量+对象键名)以获得点表示法的对象值
- 为什么在ES5中将变量对象改为词法环境
- 动态引用变量(对象)