推荐答案
// www.javascriptcn.com code example
function myAssign(target, ...sources) {
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
const result = Object(target);
sources.forEach(source => {
if (source != null) {
for (let key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
result[key] = source[key];
}
}
}
});
return result;
}本题详细解读
1. 函数功能
myAssign 函数模拟了 Object.assign 的行为,用于将一个或多个源对象的可枚举属性复制到目标对象中。如果目标对象中已经存在相同的属性,则会被源对象中的属性覆盖。
2. 参数说明
target: 目标对象,属性将被复制到这个对象中。...sources: 一个或多个源对象,它们的属性将被复制到目标对象中。
3. 实现步骤
检查目标对象是否为
null或undefined:- 如果
target是null或undefined,则抛出一个TypeError,因为无法将null或undefined转换为对象。
- 如果
将目标对象转换为对象:
- 使用
Object(target)将target转换为对象,确保即使传入的是原始值(如数字、字符串等),也能正确处理。
- 使用
遍历源对象:
- 使用
forEach遍历所有源对象。 - 对于每个源对象,检查是否为
null或undefined,如果是则跳过。
- 使用
复制属性:
- 使用
for...in循环遍历源对象的可枚举属性。 - 使用
Object.prototype.hasOwnProperty.call(source, key)确保只复制源对象自身的属性,而不包括原型链上的属性。 - 将源对象的属性复制到目标对象中。
- 使用
返回目标对象:
- 最后返回修改后的目标对象。
4. 注意事项
Object.assign是浅拷贝,myAssign也实现了浅拷贝。如果源对象的属性值是对象,则复制的是引用,而不是对象本身。Object.assign会跳过null和undefined源对象,myAssign也实现了这一行为。Object.assign会修改目标对象并返回它,myAssign也遵循了这一行为。