1、利用json 强制拷贝
var obj = {
name: 'a',
arr:[1,2,3],
date: [new Date(1536627600000), new Date(1540047600000)],
RegExp: new RegExp('\\w+'),
job:undefined
}
var newObj = JSON.parse(JSON.stringify(obj))
newObj.name = "cc"
console.log(obj) //{ name: 'a',
// arr: [ 1, 2, 3 ],
// date: [ 2018-09-11T01:00:00.000Z, 2018-10-20T15:00:00.000Z ],
// RegExp: /\w+/,
// job: undefined }
console.log(newObj) //{ name: 'cc',
// arr: [ 1, 2, 3 ],
// date: [ '2018-09-11T01:00:00.000Z', '2018-10-20T15:00:00.000Z' ],日期格式变为字符串了
// RegExp: {} } 正则变成了空对象,值为undefined的键值对直接被删除
2、for in 遍历
function deepClone(obj) {
var result = {}
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
result[key] = deepClone(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即把某个值对象复制一份到新的对象的对应值中。
} else {
result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制键值对到新的对象。
}
}
return result;
}
return obj;
}
let obj = {
name:'lily',
arr:[1,2,3],
date: [new Date(1536627600000), new Date(1540047600000)],
RegExp: new RegExp('\\w+'),
job:undefined,
obj2:{
fun:function(){}
}
};
let testObj = deepClone(obj);
testObj.name = '不知火舞';
console.log(obj); //{ name: 'lily',
// arr: [ 1, 2, 3 ],
// date: [ 2018-09-11T01:00:00.000Z, 2018-10-20T15:00:00.000Z ],
// RegExp: /\w+/,
// job: undefined,
// obj2: { fun: [Function: fun] } }
console.log(testObj) //{ name: '不知火舞',
// arr: { '0': 1, '1': 2, '2': 3 },
// date: { '0': {}, '1': {} }, 日期对象也变成了空对象
// RegExp: {}, /* 正则依然时空对象 */
// job: undefined,
// obj2: { fun: [Function: fun] } }
3、forEach遍历
function deepClone(obj) {
let copy = Object.create(Object.getPrototypeOf(obj));
let propertyNames = Object.getOwnPropertyNames(obj);
propertyNames.forEach(function (items) {
let item = Object.getOwnPropertyDescriptor(obj, items);
Object.defineProperty(copy, items, item);
});
return copy;
}
let obj = {
name:'lily',
arr:[1,2,3],
date: [new Date(1536627600000), new Date(1540047600000)],
RegExp: new RegExp('\\w+'),
job:undefined,
obj2:{
fun:function(){}
}
};
let testObj = deepClone(obj);
testObj.name = '不知火舞';
console.log(obj); //{ name: 'lily',
// arr: [ 1, 2, 3 ],
// date: [ 2018-09-11T01:00:00.000Z, 2018-10-20T15:00:00.000Z ],
// RegExp: /\w+/,
// job: undefined,
// obj2: { fun: [Function: fun] } }
console.log(testObj) //{ name: '不知火舞',
// arr: [ 1, 2, 3 ],
// date: [ 2018-09-11T01:00:00.000Z, 2018-10-20T15:00:00.000Z ],
// RegExp: /\w+/,
// job: undefined,
// obj2: { fun: [Function: fun] } }