直接使用 Object.assign(target, source)即可把source的同名属性值复制给target对象。这是浅拷贝,即如果 source 的某个属性值是对象的话,那么 target 的同名属性值会引用到 source 对应的对象,即如果修改 source.x.value ,会影响到 target.x.value。
对于简单对象:
let obj2 = JSON.parse(JSON.stringify(obj));
对于复杂对象:
function copyCommonProperties(source, dest) {
for (let key in dest) {
if (source.hasOwnProperty(key) && dest.hasOwnProperty(key)) {
if (typeof source[key] === 'object' && source[key] !== null) {
if (Array.isArray(source[key])) {
dest[key] = source[key].slice();
} else {
if (typeof dest[key] !== 'object' || dest[key] === null) {
dest[key] = {};
}
copyCommonProperties(source[key], dest[key]);
}
} else {
dest[key] = source[key];
}
}
}
}
- 克隆对象:将原始对象拷贝到一个空对象,就得到了原始对象的克隆
function clone(origin) {
return Object.assign({}, origin)
}
但上述方法,不能克隆继承的值,如果要保持继承链,需要使用:
function clone(origin) {
let originProto = Object.getPrototypeOf(origin)
return Object.assign(Object.create(originProto), origin)
}
可以试试下面的方法:
function deepCopy(obj: any): any {
if (typeof obj === 'object') {
if (Array.isArray(obj)) {
return obj.map(item => deepCopy(item));
} else {
const newObj = {};
for (const key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
}
} else {
return obj;
}
}
使用 lodash 库创建对象的深拷贝克隆(要先 npm install lodash):
import * as _ from 'lodash';
let obj2 = _.cloneDeep(obj);