js深浅拷贝

依然范特西╮ 提交于 2020-02-05 11:04:50

首先要清楚js的数据类型,和存储方式(栈,堆)。

对象的赋值其实是将对象名存储在栈中,对应存储的值为堆中数据的引用指针。

基本数据类型的存储则是直接存储在栈中。

浅拷贝:如果对象的属性的值为对象,则保存的为对象的指针,修改指针指向对象的值,则两个对象均会发生变化

Object.assign({},obj1,obj2) 

obj = {...obj1}

深拷贝:两个对象互相不干扰,修改值不会有影响

1、obj1 = JSON.parse(JSON.stringify(obj2)) 这种方法只能深拷贝对象和数组,不能拷贝函数,循环引用(就是在对象的属性对应的值为对象本身),还不能拷贝(Date,RegExp,Error)

2、for in 循环递归

function deepClone(obj){
                  if(typeof obj ==='object'){
                     //判断obj类型,这里只考虑对象和数组 
                     //typeof 返回的值有7种,均为字符串类型 number,string,boolean,undefined symbol,function,object
                     const objClone = Array.isArray(obj)?[]:{};
                     for(let key in obj){
                         if(obj.hasOwnProperty(key)){
                             objClone[key] = deepClone(obj[key])
                         }
                     }
                     return objClone
                  }else{
                      //如果不是上面两种类型直接返回
                      return obj
                  }
            
            
            }

 

先写到这

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!