核心提示:js深浅拷贝概念大家都知道js有基本类型和引用类型,当把对象赋给另一个对象的时候,修改被复制的对象的属性时,赋值的对象的属性也会被修改,这是因为对象存储的都是一块内存地址,也就是指向的都是同一内存,故...
js深浅拷贝概念
大家都知道js有基本类型和引用类型,当把对象赋给另一个对象的时候,修改被复制的对象的属性时,赋值的对象的属性也会被修改,这是因为对象存储的都是一块内存地址,也就是指向的都是同一内存,故修改时都会发生修改,直接来个事例代码。
var age = 20; var b = a; b.age = 25; console.log(a.age); //25
有了上面这个概念再来理解一下这两个概念:
浅复制:只会将对象的各个属性进行依次复制,并不会进行递归复制,而js存储对象都是存地址的,所以会导致引用。
深复制:它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。
浅拷贝代码
var surfaceCopyObj = {a:1;b:2}; function surfaceCopy(surfaceCopyObj ){ var tempSurfaceCopyObj = {}; for(var key in surfaceCopyObj){ if(surfaceCopyObj.hasOwnProperty(key)){ tempSurfaceCopyObj[key] = surfaceCopyObj[key]; } } rerurn tempSurfaceCopyObj; } console.log(surfaceCopy(surfaceCopyObj));
深拷贝代码
function deepClone(obj){ var newObj = obj.constructor === Array ? []:{};//判断参数是对象还是数组 if(typeof obj !== 'object'){ return }else{ for(var i in obj){ if(obj.hasOwnProperty(i)){ newObj[i] = typeof obj[i] === 'object'?deepClone(obj[i]):obj[i];//如果是基本类型直接复制,如果是对象类型的再递归遍历复制,这边应该有缺陷,因为tyoeof function() === 'function',故函数也是直接被拷贝的,应该对函数对象是有问题的需要修改一下 } } } return newObj }
函数问题是否可用下面方式解决?(可以试验一下)
else if((typeof obj)=='function'){ return (new obj()).constructor; }