const obj = {函数
a: 'hello',spa
b: {code
a: 'hello',对象
b: 'world'blog
},string
c: ['good', 'good','study'],it
d: function() {io
console.log('hello world')console
}function
}
对象的浅拷贝
方法一:(for in循环)
function simpleCopy (data) { let newObj = {}; if (data) { for (let i in data) { newObj[i] = data[i] } return newObj; } } const newObj = simpleCopy(obj); newObj.b.a = 'newObj'; console.log(obj.b.a) // 返回 {a: 'newObj',b: 'world'}
方法二:
const newObj = new assign({},obj);
以上的两种方法在拷贝对象的时候,都存在如下的不足:
缺点:当对象的value为对象时,被拷贝的对象的值发生变化时,原先对象的值也会发生变化
对象的深拷贝
方法一:
function deepCopy (obj) { let newObj = {}; if (obj) { newObj = JSON.parse(JSON.stringify(obj)); } return newObj; }
缺点: 当对象的value为函数的时候,这个方法没法解析
方法二:
function deepCopy(initObj, finalObj) { let obj = finalObj || {}; if (obj) { for (let i in initObj) { if (initObj[i] === obj) { // 避免相互引用出现的死循环 continue; } if (typeof initObj[i] === 'object') { obj[i] = (initObj[i].constructor === Array) ? [] : {}; arguments.callee(initObj[i], obj[i]) } else { obj[i] = initObj[i] } } return obj; } }
注: 比较理想的方法