深拷贝:拷贝值
浅拷贝: 拷贝地址
深拷贝的方法
//待拷贝的对象
let a = {
name: '张三',
grade: {
chinese: 23,
math: 90,
},
sex: '男',
friend: [{id: '李四'},'王五'],
date: new Date().toString(),
call() {
console.log('call()')
}
}
- JSON 对象
JSON.parse(JSON.stringify(a)): a 只能是扁平对象
//不能拷贝 function,会直接丢弃,ye
console.log('JSON 深拷贝a', JSON.parse(JSON.stringify(a)))
//打印结果
/*
{ name: '张三',
grade: { chinese: 23, math: 90 },
sex: '男',
friend: [ { id: '李四' }, '王五' ],
date: 'Thu Mar 05 2020 11:45:05 GMT+0800 (GMT+08:00)'
}
*/
- Object.assign(target,source)
//如果只有一级属性,则就是深拷贝
//如果一级属性里面有引用数据类型,则这个只是浅拷贝了
console.log(Object.assign({},a))
/*
打印结果
{ name: '张三',
grade: { chinese: 23, math: 90 },
sex: '男',
friend: [ { id: '李四' }, '王五' ],
date: 'Thu Mar 05 2020 11:47:39 GMT+0800 (GMT+08:00)',
call: [Function: call] }
*/
- for in 递归拷贝
/* for in 递归拷贝会将 原型上的属性方法全部拷贝过来 */
function clone(source) {
let target = source instanceof Array ? [] : {}
for (let key in source) {
if (typeof source[key] === 'object') {
target[key] = clone(source[key])
} else {
target[key] = source[key]
}
}
return target
}
/*
打印结果
{ name: '张三',
grade: { chinese: 23, math: 90 },
sex: '男',
friend: [ { id: '李四' }, '王五' ],
date: 'Thu Mar 05 2020 12:03:24 GMT+0800 (GMT+08:00)',
call: [Function: call] }//函数还是同一个函数,函数没有做到深拷贝
*/
版权声明:本文为Chennfengg222原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。