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

推荐答案

-- -------------------- ---- -------
-------- ---------------- ----------- -
  -- ------- -- ----- -
    ----- --- ----------------- ------- --------- -- ---- -- ---------
  -

  ----- ------ - ---------------

  ---------------------- -- -
    -- ------- -- ----- -
      --- ---- --- -- ------- -
        -- --------------------------------------------- ----- -
          ----------- - ------------
        -
      -
    -
  ---

  ------ -------
-

本题详细解读

1. 函数功能

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

2. 参数说明

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

3. 实现步骤

  1. 检查目标对象是否为 nullundefined:

    • 如果 targetnullundefined,则抛出一个 TypeError,因为无法将 nullundefined 转换为对象。
  2. 将目标对象转换为对象:

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

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

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

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

4. 注意事项

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