本博文源于js基础,主要探讨实现js的深拷贝和浅拷贝问题。先实现浅拷贝后实现深拷贝
浅拷贝
算法思想
准备一个空的结果数组,然后遍历原数组,在结果数组中插入原数组的每一项即可。
测试效果
附上源码
<script>
function clone(arr) {
var _arr = [];
for(var i=0;i<arr.length;i++) {
_arr.push(arr[i]);
}
return _arr;
}
</script>
深拷贝
实现原理
考虑到数组是对象里面可以复杂类型的值,如果仅仅像上面做的话,是无法做到深层次拷贝的。需要用递归先将元素扁平化,然后一个个拷贝。
测试效果
附上源码
检测o的类型,如果o的类型是基本类型值,则返回o本身即完成了o的克隆,如果o是数组,则遍历它的每一项,递归调用deepClone深克隆它的每一项,如果o是对象,则遍历每一个属性,递归调用deepClone深克隆它的每一个属性值
<script>
function deepClone(o) {
if(
typeof o=="string" ||
typeof o == "number" ||
typeof o == "undefined" ||
typeof o == "boolean"
){
return o;
}else if(Array.isArray(o)) {
var _arr = [];
for(var i=0;i<o.length;i++) {
_arr.push(deepClone(o[i]));
}
return _arr;
}else if(typeof o == "object") {
var _o = {};
for(var k in o ) {
_o[k] = deepClone(o[k]);
}
return _o;
}
}
</script>