推荐答案
-- -------------------- ---- ------- -------- ---------------- ----------- - -- ------- -- ----- - ----- --- ----------------- ------- --------- -- ---- -- --------- - ----- ------ - --------------- ---------------------- -- - -- ------- -- ----- - --- ---- --- -- ------- - -- --------------------------------------------- ----- - ----------- - ------------ - - - --- ------ ------- -
本题详细解读
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
也遵循了这一行为。