JS实现深拷贝常用的几种方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS深拷贝的几种方法</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>
<script>
let origin = ['李世民','刘邦','朱元璋','刘彻','朱棣']
/**
* 1. Object.assign() 实现深拷贝 --- 个人常用
*/
// let target = Object.assign([],origin)
/**
* 2. JSON.parse() 和 JSON.stringify() 实现深拷贝
*/
// let target = JSON.parse(JSON.stringify(origin))
/**
* 3. lodash 里面的 cloneDeep() 方法 实现深拷贝
* vue 中使用 :
* a. npm i --save lodash 下载依赖
* b. import _ from 'lodash' 在 组件 中引入
* c. 用法和下面的一样
*/
let target = _.cloneDeep(origin)
target.pop() // 修改 target 数组后
console.log('origin',origin) // origin ['李世民','刘邦','朱元璋','刘彻']
console.log('target',target) // target ['李世民','刘邦','朱元璋','刘彻','朱棣']
</script>
</body>
</html>
附
1. 通过递归的方式实现深拷贝
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for(let key in obj){
if (obj[key] && typeof obj[key] === 'object'){
objClone[key] = deepClone(obj[key]);
}else{
objClone[key] = obj[key]
}
}
}
return objClone;
}
2. 通过使用字符串作为中间量的方式实现深拷贝
var obj = {
age: '12',
showAge: function () {
console.log('哈哈');
},
};
console.log(JSON.parse(JSON.stringify(obj)));
验证