js中的浅拷贝和深拷贝

在 JavaScript 中,如果你将一个对象赋值给另一个变量,实际上是将对象的引用赋给了新变量。这意味着,如果你修改一个变量所引用的对象,那么另一个变量引用的对象也会被修改,因为它们引用的是同一个对象。

所以,如果你这样赋值:

let query2 = this.query;

然后修改 query2,那么 query 也会受到影响,因为它们引用的是相同的对象。这对于对象和数组等引用类型的变量是有效的。如果你希望在不影响原始对象的情况下创建一个对象的副本,你需要进行深拷贝而不是浅拷贝。深拷贝会创建一个原始对象的完全独立的副本,使你可以对副本进行修改,而不影响原始对象。

你可以使用工具库或手动编写函数来执行深拷贝,或者使用现有的方法(如 JSON.parse(JSON.stringify(object)))来创建深拷贝。但要注意,这种方法可能无法处理包含函数或特殊对象类型的复杂对象。

示例:

// 执行深拷贝,创建一个对象的独立副本
let query2 = JSON.parse(JSON.stringify(this.query));

这将创建 query 的深拷贝,使你可以在不影响原始 query 的情况下修改 query2

最好的方案取决于你的具体需求和应用场景。在 JavaScript 中,根据需求选择使用浅拷贝或深拷贝:

  1. 浅拷贝(Shallow Copy)
    • 适用于简单的数据结构,如对象或数组,没有嵌套对象或数组。
    • 浅拷贝会复制引用,因此修改副本可能会影响原始对象。
    • 使用 Object.assign() 或展开运算符 (...) 来创建浅拷贝。

示例:

let shallowCopy = Object.assign({}, originalObject); // 对象浅拷贝
let arrayCopy = [...originalArray]; // 数组浅拷贝
  1. 深拷贝(Deep Copy)
    • 适用于复杂的数据结构,包含嵌套对象或数组,或包含函数、正则表达式等特殊对象。
    • 深拷贝会创建原始对象的完全独立副本,修改副本不会影响原始对象。
    • 可以使用自定义递归函数、第三方库(如 lodashcloneDeep 方法)或 JSON.parse(JSON.stringify(object)) 来创建深拷贝。但要注意,JSON.stringify() 方法无法处理包含函数或循环引用的对象。

示例(使用 lodash):

const _ = require('lodash');
let deepCopy = _.cloneDeep(originalObject); // 创建深拷贝

选择哪种拷贝方式取决于你的需求。如果你确定对象结构简单且不包含嵌套,浅拷贝通常足够。如果你需要处理更复杂的数据结构,或需要确保修改副本不会影响原始对象,那么深拷贝是更安全的选择。

因为基本类型存在栈里引用类型存在堆里

引用类型会在栈里存指对应堆里的地址

不变是只指这个引用类型存在栈里的地址不变

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值