为什么我开始写博客了呢?因为今天有个场景下我需要实现这个功能,没有网络的情况下手写。逻辑写出来了,但是代码冗余量很大,其次呢,我发现好多博客写的确多多少少有点问题,所以我就扯出来这么一篇博客了
为什么需要深拷贝
因为对象直接复制给另外一个变量时,2个变量的值指向堆栈中同一条数据,改变其中一个变量中某个key的value,都会影响到另外一个变量的值
数据类型
很多博客直接就typeof判断数据类型了,时间new Data(),那也是返回的‘object’的,还有些用变量的构造函数初始化需要赋值的变量数据类型,实在是有些大才小用了
曾经看书,javascript高级程序设计中提到判断变量的数据类型,一下给出源码
const judgeDataType = function(n,type){
return Object.prototype.toString.call(n)===type;
}
使用递归
写这个函数本有点问题一直把result的初始化放在了if中,实在是有点服我自己的,导致我想了会儿为什么返回的数据不对
const deepCopy = function(n){
let result;
const flag1 = judgeDataType(n,'[object Array]');
if( flag1 ||judgeDataType(n,'[object Object]')){
result = flag1?[]:{};
for(let key in n){
result[key] = deepCopy(n[key])
}
}else{
result = n;
}
return result;
}
测试数据
以下为测试数据,欢迎来提bug
let num = {
a:1,
arr:[1,2,3,[4,5],{flag:false}],
obj:{
objChild:{
n:undefined,
d:new Date(),
e:'sssss'
}
},
fn:function(n){
++n
console.log(1)
}
}
ps:后续我会坚持写博客,一直想分享一个原生js实现的断点续传组件,若有需要可以评论中留言。
转载请注明出处,谢谢!