对象拷贝和合并
对象拷贝
浅拷贝:
Object.create(obj)
Object.assign({} , obj)
[].concat(arr)
[...array]
深拷贝:
function deepCopy(obj) {
// 如果是基本类型或函数直接返回
if (typeof obj !== 'object' || obj === null || typeof obj === 'function') {
return obj;
}
// 根据对象的类型创建一个新的空对象或数组
const copy = Array.isArray(obj) ? [] : {};
// 遍历原对象的属性
for (let key in obj) {
// 检查是否为自身属性而非原型链上的属性
if (obj.hasOwnProperty(key)) {
// 递归调用deepCopy,以实现深拷贝
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
// 值类型和 null 直接返回
return obj;
}
let clone = null;
const type = Object.prototype.toString.call(obj);
switch (type) {
case '[object Array]':
// 数组类型
clone = [];
for (let i = 0; i < obj.length; i++) {
clone.push(deepClone(obj[i]));
}
break;
case '[object Date]':
// 日期类型
clone = new Date(obj.getTime());
break;
case '[object RegExp]':
// 正则表达式类型
clone = new RegExp(obj);
break;
case '[object Function]':
// 函数类型
clone = obj;
break;
default:
// 对象类型(包括普通对象和其他内置对象)
clone = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
break;
}
return clone;
}
函数拷贝
function cloneFunction(func) {
return eval('(' + func.toString() + ')');
}
// 使用示例
const func1 = function () {
console.log('Hello, world!');
};
const func2 = cloneFunction(func1);
console.log(func1 === func2); // false
合并对象
hasOwnProperty 是 JavaScript 中的一个对象方法,用于检查对象是否包含指定的属性(不包括原型链上的属性)。
function mergeObjects(obj1, obj2) {
// 遍历 obj2
for (const key in obj2) {
// 判断 key 是否在obj2本身上,而不在原型上
if (obj2.hasOwnProperty(key)) {
// 判断 obj2[key] 是否为 object 或者 array
const attr = obj2[key];
if (typeof attr === 'object' && attr !== null) {
if (Array.isArray(attr)) {
obj1[key] = attr.slice();
} else {
// 如何 obj1[key] 不是对象 或者为 null,需要初始化为{}
if (typeof obj1[key] !== 'object' || obj1[key] === null || Array.isArray(obj1[key])) {
obj1[key] = {};
}
obj1[key] = mergeObjects(obj1[key], attr);
}
} else {
// 对于基本数据类型,直接覆盖
obj1[key] = obj2[key];
}
}
}
return obj1;
}
// 示例用法
const obj1 = {
a: 1,
b: {
c: 2,
d: [3, 4]
},
h: 1
};
const obj2 = {
b: {
c: 5,
e: 6
},
f: 7,
g: function () {},
h: ['1', '2']
};
const mergedObj = mergeObjects(obj1, obj2);
console.log(mergedObj);