JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进行地址的拷贝,最终两个变量指向同一份数据。
一、 浅拷贝
对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.
实现
- 现有方法
数组的浅拷贝:slice、concat
对象的浅拷贝:Object.assign() - 实现方法
var shallowCopy = function(obj) {
if (typeof obj !== 'object') return;
// 判断是新建一个数组还是对象
var newObj = obj instanceof Array ? [] : {};
// 遍历obj,并且判断是obj的属性才拷贝
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = obj[key];
}
}
return newObj;
}
二、深拷贝
实现
-
JSON.parse
方法
JSON.parse(JSON.stringify(obj));
- 实现方法
var deepCopy = function(obj) {
if (typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}
限制:
无法实现对函数 、RegExp等特殊对象的克隆
会抛弃对象的constructor,所有的构造函数会指向Object
对象有循环引用,会报错