一:浅拷贝
浅拷贝方法一:
使用:var newObj = Object.assign({}, obj1)
原理:Object.assign()方法用于将一个或多个对象的可枚举属性复制到目标对象
实例:
该实例中,对象obj被合并到第一个参数{}中,并将合并后的结果返回
要注意,如果此时,第一个参数已经变成了合并后的结果:
浅拷贝方法二:
使用:var newObj = Object.create(obj)
原理:创建一个新对象,并使用当前对象的_proto_
浅拷贝方法三:
使用:Array.prototype.concat()
原理:利用数组的拼接功能,将多个数组拼接后的结果返回
浅拷贝方法四:
使用:Array.prototype.slice()
原理:利用数组的截取功能,将多个数组拼接后的结果返回
二:深拷贝
深拷贝方法一:
使用:var newObj = JSON.parse(JSON.stringify(obj))
原理:先序列化,再反序列化
深拷贝方法二:
终极方法:www.cnblogs.com/buxiugangzi…
function deepClone(data) {
const type = this.judgeType(data);
let obj;
if (type === 'array') {
obj = [];
} else if (type === 'object') {
obj = {};
} else {
// 不再具有下一层次
return data;
}
if (type === 'array') {
// eslint-disable-next-line
for (let i = 0, len = data.length; i < len; i++) {
obj.push(this.deepClone(data[i]));
}
} else if (type === 'object') {
// 对原型上的方法也拷贝了....
// eslint-disable-next-line
for (const key in data) {
obj[key] = this.deepClone(data[key]);
}
}
return obj;
}
function judgeType(obj) {
// tostring会返回对应不同的标签的构造函数
const toString = Object.prototype.toString;
const map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
};
if (obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
}
深拷贝方法三: 函数库lodash
该函数库提供了 _.cloneDeep 实现深拷贝。
var _ = require('lodash');
var obj1 = {
a: 1,
b: { name: { g: 1 } },
c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.name === obj2.b.name); // false