javascript - 为什么此代码引用不同的结果
问题描述
我是 JS 新手,正在学习 JS 中的值和引用类型,但我在下面的代码中遇到了一些困惑:
const obj = {
arr: [{
x: 17
}]
};
let z = obj.arr;
z = [{
x: 25
}];
console.log(obj.arr[0].x);
上面的代码输出 17 但为什么呢?嗯,arr 是一个引用类型,也就是说,它是可变的,然后我们将 obj.arr 与变量 z 相等,因此 z 持有对 obj 对象中 arr 数组的引用。最后,z 保持 17,然后我们将其更改为 25,但它输出 17。
解决方案
第一次,你有这样的事情:
obj ---> {
arr ---+
} |
|
v
[
[0] ---+
] |
^ |
| v
| { x: 17 }
|
|
z ----------------+
请注意,z
现在指向与但不是相同的对象obj.arr
。 obj.arr
修改z
now 的值会导致 of 的值(和引用)z
发生变化,但obj.arr
引用的对象和以前一样:
obj ---> {
arr ---+
} |
|
v
[
[0] ---+
] |
|
v
{ x: 17 }
z ----> [
[0] ----> { x: 25 }
]
这就是为什么obj.arr
没有改变。
但是如何通过 改变它z
?
你不能改变obj.arr
它自己,但你仍然可以改变它。
而不是你的代码,使用这个:
z[0] = { x:25 }
现在你有:
obj ---> {
arr ---+
} |
|
v
[
[0] ---> { x: 25 }
]
^
|
| { x: 17 } -----> Garbage collection
|
|
z ----------------+
const obj = {
arr: [{ x: 17 }]
};
let z = obj.arr;
z[0] = { x: 25 };
console.log(obj.arr[0].x);
推荐阅读
- php - 多变量重定向
- python-3.x - Spyder 用 Tkinter 后端绘制无响应
- vba - MSForms.ReturnInteger - 使用 vbKey 改变形状的位置
- java - 如果我在保存之间读取消息,FileOutputStream 只会将消息写入文件
- maven-release-plugin - Bintray 409 冲突 - mvn 发布插件上传 jar 两次?
- gnuplot - Gnuplot - 拟合
- swift - 将 SceneKit 与 SwiftUI 一起使用时如何访问 SCNSceneRendererDelegate 方法?
- excel - 如何根据列数据或使用数据透视从单个工作表创建多个 Excel 工作表
- ios - 图像在 tableView Swift 中变回
- django - 在这种情况下,你能解释一下“query_string”和“headers”吗