思路:1递归子元素,子元素传入函数,基本数据类型不用递归直接返回,{}和[]需要遍历
const data = [[[{ a: 'b' }]], { a:[1,2,null,undefined,/a/] ,b(){} ,c:'111'} ]
function myTypeofArrayOrObject(tt) {//判断数据是否为{}和[]
let flagBoolean = (Object.prototype.toString.call(tt) === '[object Object]' ||
Object.prototype.toString.call(tt) === '[object Array]')
return flagBoolean
}
function myClone(oldData) {
let newData;
if (myTypeofArrayOrObject(oldData)) {
newData = Array.isArray(oldData) ? [] : {}
for (let i in oldData) {
newData[i]=myClone(oldData[i])
}
} else {
newData = oldData
}
return newData
}
let newData=myClone(data)
data[0][0][0].a=1;//改值
data[1].a[0]='aaaa'
console.log(data ,newData)
效果

缺点: 1.for...in 性能不好
2.引用变量不行。
const arr=['单身狗'];
var str= '鹅';
const data = [[[{ a: 'b' }]],{a:[1,2,null,undefined,/a/],b(){},c:'111'},arr,str]
let newData=myClone(data)
arr[3]='老王';
arr.push('猫');
str='村霸';
console.log(data ,newData)
就很迷,引用数据类型的子元素改动一个变一个不变,这个好理解
变量两边都改不动,就很迷,估计数组引用变量和变量复制变量一样。
3.菜鸡一个,不知道还有问题没,也不知道错了没,欢迎批评

网友评论