const obj = {
a: 'hello',
b: {
a: 'hello',
b: 'world'
},
c: ['good', 'good','study'],
d: function() {
console.log('hello world')
}
}
对象的浅拷贝
方法一:(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; } }
注: 比较理想的方法