javascript - 删除复制对象内的对象的键也会删除现有对象
问题描述
var origin = { a: 1, b: { c: 2, d: 3 } }; // origin object
var copy_obj = { ...origin } // or Object.assign({}, origin.b)
delete copy_obj.b.c; // delete copy object
console.log(origin) // { a: 1, b: { d: 3 } };
我正在研究事物的不变性。
但是,上面的示例显示您要删除 copy_obj 的 bc 元素。但是原点也被删除了。
为什么会这样?
解决方案
Object.assign({}, origin.b)
或传播语法{...obj}
执行浅拷贝。因此,存储在b
origin 属性中的对象不会被克隆,即它维护对嵌套对象的引用。
使用以下内容进行深度克隆。
JSON.parse(JSON.stringify(obj))
var origin = { a: 1, b: { c: 2, d: 3 } }; // origin object
var copy_obj = JSON.parse(JSON.stringify(origin));
delete copy_obj.b.c;
console.log(origin)
注意:这仅适用于可以序列化的对象
例如:
// Object having functions
const obj= {
a: 1,
b: () => {return 2}
}
const copy = JSON.parse(JSON.stringify(obj));
// property `b` won't be copied as it is a function and can't be serialized.
console.log(copy)
推荐阅读
- python - ldap3 在 docker 容器中使用时“无法打开套接字”
- microsoft-graph-api - 尝试读取组文件时收到“拒绝访问”
- c# - 如何避免过多的 != null 检查
- typescript - 当 observable 满足条件时,RxJS 停止 foreach
- angular - 如何使用 Angular Material [mat-form-field] 向文本框插入值
- c# - 使用实体框架从数据库读取数据会导致对象的字段丢失
- php - $_SERVER 变量来识别请求来自哪里?
- javascript - 如何使用 .orderby() 按时间戳对 Firebase 数组中的项目进行排序
- prometheus - 正确检测 Prometheus 计数指标的变化
- sql - 将具有空值的新列添加到大表