前端手写代码面试题
目录

实现一个函数 myAssign(target, ...sources),模拟 Object.assign

· 约 3 分钟读完 · 第 19 / 125 章

推荐答案

本题详细解读

1. 函数功能

myAssign 函数模拟了 Object.assign 的行为,用于将一个或多个源对象的可枚举属性复制到目标对象中。如果目标对象中已经存在相同的属性,则会被源对象中的属性覆盖。

2. 参数说明

  • target: 目标对象,属性将被复制到这个对象中。
  • ...sources: 一个或多个源对象,它们的属性将被复制到目标对象中。

3. 实现步骤

  1. 检查目标对象是否为 null 或 undefined:

    • 如果 target 是 null 或 undefined,则抛出一个 TypeError,因为无法将 null 或 undefined 转换为对象。
  2. 将目标对象转换为对象:

    • 使用 Object(target) 将 target 转换为对象,确保即使传入的是原始值(如数字、字符串等),也能正确处理。
  3. 遍历源对象:

    • 使用 forEach 遍历所有源对象。
    • 对于每个源对象,检查是否为 null 或 undefined,如果是则跳过。
  4. 复制属性:

    • 使用 for...in 循环遍历源对象的可枚举属性。
    • 使用 Object.prototype.hasOwnProperty.call(source, key) 确保只复制源对象自身的属性,而不包括原型链上的属性。
    • 将源对象的属性复制到目标对象中。
  5. 返回目标对象:

    • 最后返回修改后的目标对象。

4. 注意事项

  • Object.assign 是浅拷贝,myAssign 也实现了浅拷贝。如果源对象的属性值是对象,则复制的是引用,而不是对象本身。
  • Object.assign 会跳过 null 和 undefined 源对象,myAssign 也实现了这一行为。
  • Object.assign 会修改目标对象并返回它,myAssign 也遵循了这一行为。