深拷贝的三种方式
1,JSON.parse(JSON.stringjfy(obj))
缺点:取不到undefined的key,如果对象里有函数,函数无法被拷贝下来,无法拷贝对象原型链中的属性和方法
2,Object.assign({},obj)
缺点:不是真正的深拷贝,属性是对象的时候,对象还是浅拷贝
3,递归方式实现深拷贝
json.parse(json.stringfy(obj))
深拷贝:
//方法一:循环遍历
function deepClone(tartgetObj, endObj) {
var obj = endObj || {}
for (var key in targetObj) {
if(typeof targetObj[key] === 'object') {
obj[key] = tartgetObj.construtor === Array ? [] : Object.create(null)(方法二:{})
deepClone(tartgetObj[key], obj[key])
} else {
obj[key] = targetObj[key]
}
}
return obj
}
//方法二
最简单的方法最新的方法,用ES6的扩展运算符(…)进行赋值,这个应该会在以后被广泛应用,这个方法也完美解决了JSON.stringify+JSON.parse不能实现的对函数方法深拷贝:
let obj1 = { name: 'Jay', age: '22',fun:function() {console.log(1)} }
let obj2 = { ...obj1 };
obj2.name = 'xxx'
console.log(obj1.name, obj2.name, obj2)
//输出结果为(jay xxx {name: "xxx", age: "22", fun: ƒ})
//方法三
var copyObj = JSON.parse(JSON.stringify(targetObj)) //object->string->object
深拷贝的两种方法:
//方法一:循环遍历
function deepClone(tartgetObj, endObj) {
var obj = endObj || {}
for (var key in targetObj) {
if(typeof targetObj[key] === 'object') {
obj[key] = tartgetObj.construtor === Array ? [] : Object.create(null)
deepClone(tartgetObj[key], obj[key])
} else {
obj[key] = targetObj[key]
}
}
return obj
}
//方法二:JSON.stringify()和JSON.parse()
var copyObj = JSON.parse(JSON.stringify(targetObj)) //object->string->object
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;}
// JSON.parse与JSON.stringify实现深拷贝
深拷贝
深拷贝: 赋值的时候,如果发现该值是引用数据类型,就循环,一直去找基本数据,找到就赋值。如果赋值的时候碰到引用数据类型直接赋值,那么这个时候就是浅拷贝了。
Object.create() // 一般用于浅拷贝
JSON.parse(),JSON.stringify // 一般用于深拷贝
深拷贝的两种方法: //方法一:循环遍历 function deepClone(tartgetObj, endObj) { var obj = endObj || {} for (var key in targetObj) { if(typeof targetObj[key] === 'object') { obj[key] = tartgetObj.construtor === Array ? [] : Object.create(null) deepClone(tartgetObj[key], obj[key]) } else { obj[key] = targetObj[key] } } return obj } //方法二:JSON.stringify()和JSON.parse() var copyObj = JSON.parse(JSON.stringify(targetObj)) //object->string->object