JavaScript浅拷贝与深拷贝的代码实现解析

需积分: 50 0 下载量 113 浏览量 更新于2024-12-13 收藏 1KB ZIP 举报
" 浅拷贝(Shallow Copy): 浅拷贝是指创建一个新的复合对象,然后将原对象中的顶层元素复制到新对象中,如果元素是基本类型,拷贝的就是值本身,如果元素是引用类型(对象或数组),拷贝的就是引用地址。因此,新旧对象中的引用类型元素会指向同一个内存地址。在JavaScript中,浅拷贝常见的实现方法有以下几种: 1. Object.assign()方法:这是ES6提供的一个方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,它进行的是浅拷贝。 ```javascript let obj1 = { a: 1, b: { c: 2 } }; let obj2 = Object.assign({}, obj1); obj2.a = 2; // 对基本类型的属性更改不影响obj1 obj2.b.c = 3; // 对引用类型属性的更改会影响到obj1 ``` 2. 展开运算符(...):在ES6中引入的扩展运算符可以用来实现浅拷贝,效果与Object.assign()类似。 ```javascript let obj1 = { a: 1, b: { c: 2 } }; let obj2 = { ...obj1 }; ``` 3. Array.prototype.slice()方法:对数组使用slice()方法可以创建一个数组的浅拷贝。 ```javascript let arr1 = [1, 2, [3]]; let arr2 = arr1.slice(); arr2[2][0] = 4; // 修改嵌套数组元素,原数组也会被修改 ``` 4. 使用循环遍历数组或对象的属性进行赋值,也是一种浅拷贝的实现方式。 ```javascript function shallowCopy(obj) { let copy = {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = obj[key]; } } return copy; } ``` 深拷贝(Deep Copy): 深拷贝是指创建一个新的复合对象,并递归地复制原对象的所有层级的子对象,从而完全独立于原对象。深拷贝不会产生引用同一个对象的副本,任何一个对象的更改都不会影响到另一个对象。在JavaScript中实现深拷贝有多种方式: 1. JSON.parse()与JSON.stringify()方法结合:这是实现深拷贝的一种简单方式,通过将对象转换为JSON字符串,然后再将字符串解析成新的对象。 ```javascript let obj1 = { a: 1, b: { c: 2 } }; let obj2 = JSON.parse(JSON.stringify(obj1)); obj2.b.c = 3; // 改变obj2的深层属性不会影响obj1 ``` 2. 使用递归函数进行深拷贝:这种方法需要编写一个能够递归复制对象所有层级属性的函数。 ```javascript function deepCopy(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let copy = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } return copy; } ``` 3. 使用第三方库进行深拷贝:一些成熟的JavaScript库提供了深拷贝的函数,例如lodash的_.cloneDeep()方法。 ```javascript // 引入lodash库后使用 import _ from 'lodash'; let obj1 = { a: 1, b: { c: 2 } }; let obj2 = _.cloneDeep(obj1); obj2.b.c = 3; // 改变obj2的深层属性不会影响obj1 ``` 注意事项: - 使用JSON.parse(JSON.stringify())方法进行深拷贝时,不能处理函数和undefined等特殊类型,因为JSON格式不支持这些类型。 - 递归深拷贝函数需要谨慎处理循环引用的问题,否则可能会导致栈溢出。 以上内容是基于文件信息中“js代码-浅拷贝深拷贝”的知识点梳理。
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部