浅拷贝和深拷贝

博客介绍了浅拷贝和深拷贝的概念。浅拷贝以赋值形式拷贝引用对象,修改新对象会影响原对象;深拷贝是完全拷贝新对象,修改新对象不影响原对象。还列举了深拷贝的方法,如利用JSON、Lodash、递归等,以及仅深拷贝第一层级的方法,如ES6拓展运算符和Object.assign()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅拷贝

以赋值的形式拷贝引用对象,新对象只是原对象的一个引用,修改新对象时原对象也会受到影响

深拷贝

完全拷贝一个新对象,是“值”而不是“引用”,修改新对象时原对象不再受到任何影响

拷贝所有层级的对象属性和数组元素:

  1. 利用JSON
let newObj = JSON.parse(JSON.stringify(oldObj))
  1. Lodash
let newObj = _.cloneDeep(oldObj)
  1. 递归进行逐一赋值
 	function deepCopy(oldObj) {
            var newObj = oldObj.instanceof Array ? [] : {}
            for (var item in oldObj) {
                if (typeof oldObj[item] === "object") {
                    newObj[item] = deepCopy(oldObj[item]);
                } else {
                    newObj[item] = oldObj[item];
                }
            }
            return obj;
        }

仅“深”拷贝第一层级的对象属性或数组元素,更深层次的拷贝是浅拷贝:

  1. ES6的拓展运算符…(三点运算符)
let newObj = {...oldObj}
  1. ES6的Object.assign()
let newObj = Object.assign({}, oldObj)
案例
// 拷贝第一层级
let oldObj = { type: 'oldObj' };
let newObj = { ...oldObj };
newObj.type = 'newObj';
console.log(oldObj); // {type: 'oldObj'} // 不随着newObj的改变而改变
console.log(newObj); // {type: newObj'} 
// 对象值为引用类型时,拷贝多层级,引用类型进行深拷贝也只是拷贝了引用地址

let oldObj = { obj: { type: 'oldObj' } };
let newObj = { ...oldObj };
newObj.obj.type = 'newObj';
console.log(oldObj); // { obj: { type: 'newObj' } } // 随着newObj的改变而改变
console.log(newObj); // { obj: { type: 'newObj' } } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值