深拷贝和数组扁平化
这两天做笔试题的时候遇到了深拷贝,在js中,一些基本类型是存在栈空间里的,而引用类型如object function之类的都是存在堆内存之中,只不过是他们的地址是在栈内存,通过地址找到对内存空间中的数据
上代码
function deepClone(obj){ var cloneobj = Array.isArray(obj)?[]:{}; //判断是数组还是对象 if(obj && typeof obj === "object"){ //判断当前的对象是否存在且类型是否object for(key in obj){ // 遍历对象 if(obj.hasOwnProperty(key)){ //判断对象属性值是否存在 if(obj[key] && typeof obj[key] ==="object"){ // 进入元素判断 cloneobj[key] = deepClone(obj[key]); //如果子元素也为对象或者数组就可以进行递归调用 }else{ cloneobj[key] = obj[key];//不是则正常赋值 } } } } return cloneobj; }
2. 数组扁平化有很多方法,这里介绍两种,第一种arr.join().split(''); 这种方法简单粗暴,先把数组转化为字符,然后再将字符切割为数组;
第二种就上代码
function flatten(arr){ let res =[]; if(Array.isArray(arr)){ for(let i =0; i<arr.length; i++){ if(Array.isArray(arr[i])){ res = res.concat(flatten(arr[i]) }else{ res.push(arr[i]) } } } return res; }