合并对象a合b,b对象的属性值会覆盖掉a对象的属性值, 如果a对象某个属性att1在b对象上不存在,那么会保留下来att1这个属性。
const extendObj = (...args: any[]):any => {
let options, name, src, copy, copyIsArray, clone,
target = args[0] || {},
i = 1,
length = args.length,
deep = false;
if (typeof target === 'boolean') {
deep = target;
target = args[i] || {};
i++;
}
if (typeof target !== 'object' && typeof target !== 'function') {
target = {};
}
if (i === length) {
target = args[0] || {};
i--;
}
for (; i < length; i++) {
if ((options = args[i]) != null) {
for (name in options) {
src = target[name];
copy = options[name];
if (target === copy) {
continue;
}
if (deep && copy && ((isPlainObject(copy)) ||
(copyIsArray = Array.isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && Array.isArray(src) ? src : [];
} else {
clone = src && (isPlainObject(src)) ? src : {};
}
target[name] = extendObj(deep, clone, copy);
} else if (copy !== undefined) {
target[name] = copy;
}
}
}
}
return target;
}
const isPlainObject = (obj: any):any => {
let proto, Ctor;
let getProto = Object.getPrototypeOf;
let class2type = {};
let toString = class2type.toString;
let hasOwn = class2type.hasOwnProperty;
let fnToString = hasOwn.toString;
let ObjectFunctionString = fnToString.call(Object);
if (!obj || toString.call(obj) !== '[object Object]') {
return false;
}
proto = getProto(obj);
if (!proto) {
return true;
}
Ctor = hasOwn.call(proto, 'constructor') && proto.constructor;
return typeof Ctor === 'function' && fnToString.call(Ctor) === ObjectFunctionString;
}
newObj = extendObj(true, obj1, obj2)
let obj1 = {
a:1,
b:2,
c: {
d:3,
e:4,
f:() => {console.log('5')}
}
}
let obj2 = {
a:'a',
b:'b',
c:{
d:'d',
e:'e',
g: () =>{console.log('g')}
},
h: new Date()
}
打印的newObj的结果如下截图: