浅拷贝
是基本数据类型,拷贝的是栈中的值
是复杂数据类型,拷贝的是栈中的地址,拷贝对象与被拷贝对象公用一个堆的地址
js
const obj={a:1, good:{name:'汉堡',eat{name:'汉堡'}} }
function foo(obj) {
const newObj = {}
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
newObj[prop] = obj[prop] } }
return newObj }
const newObj=foo(obj)
拓展运算符
const obj={a:1, good:{name:'汉堡',eat{name:'汉堡'}} }
const newObj={...obj}
Object.assign
const obj={a:1, good:{name:'汉堡',eat:{name:'汉堡'}} }
const newObj=Object.assogn({},obj)
slice
const obj = [1, 3, 2, 4, 5, 8]
const newObj = obj.slice()
深拷贝 栈中创建一个新的地址指向堆中新开辟的属性相同的新空间,且修稿一个对象的属性不会影响另一对象
拷贝对象
const obj = {
a: 1,
good: {
name: '汉堡',
eat: {
name: '汉堡',
say: () => {
return 'ohhhh'
}
}
}
}
JSON
缺点:会忽略symbol undefined function
const newObj = JSON.parse(JSON.stringify(obj))
lodash 推荐
const _ = require('lodash')
const newObj = _.clone(obj)
简易递归
const deepObj = (obj) => {
const newObj = Array.isArray(obj) ? [] : {}
for (const prop in obj) {
if (typeof obj[prop] === 'object') {
if (obj.hasOwnProperty(prop)) newObj[prop] = deepObj(obj[prop])
} else {
newObj[prop] = obj[prop]
}
} return newObj
}
const newObj = deepObj(obj)