深浅拷贝都只针对于引用数据类型;
基本数据类型:Number、String、Boolean、Null、Undefined、Symbol(ES6);
引用数据类型:Object(在JS中除了基本类型以外都是对象,包括数组、函数、正则);
1、区别:
浅拷贝:只复制对象的第一层属性,只复制只想指向某个对象的指针,而不复制对象本身,新旧对象共享同一个内存;
深拷贝:对对象的属性进行递归复制,创造一个一摸一样的对象,新旧对象不共享内存,修改新不会修改原对象;
2、浅拷贝实现方式:
(1)、自定义函数
function copy(obj) {
var newObj = {}
for(var i in obj) {
newObj[i] = obj[i]
}
return newObj
}
(2)、ES6的Object.assign()基本类型深拷贝、引用类型浅拷贝
let newObj = Object.assign({},obj)
(3)、ES6的对象扩展
let newObj = {...obj}
3、深拷贝的实现方式
(1)、JSON.stringify 和 JSON.parse无法拷贝函数、原型链上的属性和方法
let newObj = JSON.parse(JSON.stringify(obj))
(2)、lodash
var _ = require('lodash');
var newObj = _.cloneDeep(obj);
(3)、自己封装
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === "object") {
// for...in 会把继承的属性一起遍历
for (let key in obj) {
// 判断是不是自有属性,而不是继承属性
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象或数组,如果是,递归复制
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = this.deepClone(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}