oldObj = {
prop: 'old',
sonObj: {
name: 'old'
}
}
已经分不清什么浅拷贝了
浅拷贝
newObj111 = oldObj
一级拷贝
newObj222 = Object.assign({}, oldObj,{prop1: '1'}) // sunObj 仍然引用的地址
newObj222.__proto__
// {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
newObj333 = Object.create(oldObj) // 创建的对象拥有明确的原型
newObj333.__proto__
// {name: "xiaoming", age: 23, sonObj: {…}}age: 23name: "xiaoming"sonObj: {name: 3}__proto__: Object
underscore
var obj = _.cloneDeep(oldObj);
深拷贝
json 装换
// 不能转换 function 和 regExp
var obj1 = { fun: function(){ console.log(123) } };
var obj2 = JSON.parse(JSON.stringify(obj1));
// {}
函数
function deepClone (oldObj) {
let newObj = {}
for (let i in oldObj) {
const value = oldObj[i]
if (typeof value === 'Object' || typeof value === 'Array') {
newObj[i] = deepCopy(value)
} else {
newObj[i] = oldObj[i]
}
}
return newObj
}
newObj444 = deepClone(oldObj)
函数改版(最佳实践)
jQuery
var obj = $.extend(true, {}, oldObj);
Lodash
var obj = _.cloneDeep(oldObj);
内容浅显,欢迎纠错补充