克隆分为浅克隆和深度克隆:
对于原始值而言,直接复制是对值的复制。而对引用值的拷贝是地址的拷贝,这与他们的数据结构有关。
原始值直接存放在栈内存中(房间里有的东西),而且对于引用值,栈内存中存的是地址(内部数据的地址,相当于门的钥匙)
当我们引用值拷贝的时候,就是多配了一把钥匙给另外一个变量。(两个变量都可以改变房间里的数据)
上面说到,浅拷贝只能拷贝引用值的地址,这不是我们想要的。我们需要的是两份数据是相互独立的,
所以深度克隆实现的目的是创建一个新的房间,把想要的数据拷贝进来,而不是拷贝他的地址。
深度克隆实现:
第一步:数据的判断。是否是原型链上的,是否是引用值,是否是原始值,
第二步:筛选掉原型上的数据,引用值使用递归继续拷贝,原始值复制给新对象。
function deepclone(origin, target) {
var target = target || {},
toSter = Object.prototype.toString,
arrstr = '[object Array]';
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== null && typeof (origin[prop]) === 'object') {
target[prop] = toSter.call(origin[prop]) === arrstr ? [] : {};
deepclone(origin[prop],target[prop]);
} else {
target[prop] = origin[prop];
}
}
}
}
以上代码简单实现对引用值中对象和数组的拷贝,对包装类没有实现。