浅拷贝
定义:对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变
方法:
1,Object.assign
ES6中拷贝对象的方法,接受的第一个参数是拷贝的目标target,剩下的参数是拷贝的源对象sources(可以是多个)
let target = {}; let source = { a: '123', b: {name: 'javascript'} } Object.assign(target,source); console.log(target); // {a:'123',b:{name:'javascript'}}
Object.assign使用注意事项:
- 只拷贝源对象的自身属性(不拷贝继承属性)
- 不会拷贝对象不可枚举的属性
- undefined和null无法转成对象,他们不能作为Object.assign参数,但是可以作为源对象
- 属性名为Symbol 值的属性,可以被Object.assign拷贝
2,Array.prototype.slice
let array = [{a:1},{b:2}] let array1 = array.slice(0); console.log(array1)
3,扩展运算符
let obj = {a:1,b:{c:1}} let obj2 = {...obj} console.log(obj2)
深拷贝
定义: 开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
// 1. JOSN.stringify()/JSON.parse() let obj = {a: 1, b: {x: 3}} JSON.parse(JSON.stringify(obj)) // 2. 递归拷贝 function deepClone(obj) { let copy = obj instanceof Array ? [] : {} for (let i in obj) { if (obj.hasOwnProperty(i)) { copy[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i] } } return copy }