深拷贝 指:拷贝后的object改变时不会影响原数组。
-常见
* 循环拷贝包括函数
var isObject=function(obj){
var type=typeof obj
return type==='function'||type==='object'&&!!obj
}
var deepClone=function(obj){
if(!isObject(obj)) return obj
var result=obj.constructor() //返回对创建此对象的数组函数的引用
for(var i in obj){
if(obj.hasOwnProperty(i)){ //这样就不会拷贝继承的原型的一些属性(判断特定的自身(非继承)属性。)
result[i]=deepClone(obj[i])
}
}
return result
}
var msg=[123, {a: 1, b: {c: 2}}, 456]
console.log(deepClone(msg))
- 通过 JSON 对象实现深拷贝
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone2(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
/*
JSON对象实现深拷贝的一些问题
* 无法实现对对象中方法的深拷贝
*/
- 通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);
- Object.assign()拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
- lodash函数库实现深拷贝
lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝
关注微信公众号了解更多有趣的小知识