- 1、Object.assign
Object.assign 可以把 n 个源对象拷贝到目标对象中去,如下
let m ={name: {asd: '123'}}
let n = Object.assign({}, m)
console.log(n)
运行结果:
{name: {asd: '123'}}
那到底是深拷贝还是浅拷贝呢,答案是第一级属性深拷贝,以后级别属性浅拷贝 。大家看下面两段代码
例1
let s ={name: {asd: '123'}}
let d = Object.assign({}, s)
d.name.asd = '123456789'
console.log(d, s)
运行结果:
{name:{asd: "123456789"}}
{name:{asd: "123456789"}}
例2
let o ={name: {asd: '123'}}
let p = Object.assign({}, o)
p.name = '123456789'
console.log(p, o)
运行结果:
{name: "123456789"}
{name: {asd: "123"}}
还有数组的slice()这些,和Object.assign同理,这些只深复制了基本类型数据类型,不是真正意义的深复制,当然,如果要复制的对象或者数组都是简单数据类型,那就大胆用吧。
- 2、深拷贝
首推的方法简单有效,JSON.stringfy()和JSON.parse()即可搞定。但是这种简单粗暴的方法有其局限性。当值为undefined、function、symbol 会在转换过程中被忽略。。。所以,对象值有这三种的话用这种方法会导致属性丢失。
所以如果对象值中有这哥仨的话就要采用别的方法了,比如自己写个函数什么的搞定,比如这样。
deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = this.deepCopy(obj[key]); //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
},