js浅拷贝与深拷贝
基本数据类型不会存在浅拷贝,引用数据类型存在浅拷贝
深拷贝方法
一、纯数组拷贝:(仅限于不嵌套)
1,for循环:
var arr1 = [1, 2, 3];
var arr2 = [];
for (var i = 0; i < arr1.length; i++)
{arr2.push(arr1[i]);}
2.concat()
var arr1 = [1, 2, 3];
var arr2 = arr1.concat();
3.slice()
var arr1 = [1, 2, 3];
var arr2 = arr1.slice(0);
4.ES6:…语法
也可以拷贝对象,但是仅限于不嵌套的情况
var arr1=[1,2,3,4,5,]
var arr2=[...arr1]
二、对象的深拷贝
1.JSON.parse+JSON.stringify:内部可嵌套对象或数组
var obj1 ={name:"jack",age:18};
var obj2=JSON.parse(JSON.stringify(obj1))
缺点:undefined、function、symbol 会在转换过程中被忽略
三、综合深拷贝
自己编写:
// 深拷贝函数封装
function deepCopy(obj) {
// 根据obj的类型判断是新建一个数组还是对象
let newObj = Array.isArray(obj)? [] : {};
// 判断传入的obj存在,且类型为对象
if (obj && typeof obj === 'object') {
for(key in obj) {
// 如果obj的子元素是对象,则进行递归操作
if(obj[key] && typeof obj[key] ==='object') {
newObj[key] = deepCopy(obj[key])
} else {
// // 如果obj的子元素不是对象,则直接赋值
newObj[key] = obj[key]
}
}
}
return newObj // 返回新对象
}