MST

星途 面试题库

面试题:JavaScript复杂对象赋值表达式的性能考量

假设有两个复杂对象 `obj1 = { prop1: 'value1', prop2: { subProp1: 'value2', subProp2: [1, 2, 3] }, prop3: function() { return 'function value'; } }` 和 `obj2 = {}`,现在要将 `obj1` 赋值给 `obj2`,使用 `obj2 = obj1` 和 `Object.assign(obj2, obj1)` 两种方式,从性能角度详细分析它们的优缺点,以及在不同场景下应如何选择。
47.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

使用 obj2 = obj1

  • 优点
    • 性能高:这种方式只是简单地将 obj1 的引用赋给 obj2,执行速度非常快,几乎不消耗额外的性能。因为它没有创建新的对象,也没有遍历源对象的属性进行复制。
  • 缺点
    • 数据关联obj2obj1 指向同一个对象,对 obj2 的任何修改都会直接影响到 obj1,反之亦然。如果在后续操作中需要独立操作两个对象,这种方式可能会导致难以察觉的错误。
  • 适用场景
    • 当需要两个变量指向同一个对象,并且希望对其中一个变量的修改能同步反映到另一个变量时,例如在某些需要共享数据状态的场景下适用。

使用 Object.assign(obj2, obj1)

  • 优点
    • 数据独立:会创建一个新的对象(如果 obj2 为空对象),将 obj1 的属性复制到 obj2 中,使得 obj2obj1 是两个独立的对象(虽然属性值为对象或数组时仍是浅拷贝)。这在大多数需要独立操作对象的场景下非常有用,避免了意外的数据相互影响。
  • 缺点
    • 性能消耗:它需要遍历 obj1 的所有可枚举属性,并将其复制到 obj2 中,这在对象属性较多时会有一定的性能开销。而且对于嵌套对象或数组,只是浅拷贝,若要深拷贝还需额外处理,这会进一步增加复杂性和性能开销。
  • 适用场景
    • 当需要两个对象在逻辑上独立,即对一个对象的修改不影响另一个对象时适用。尤其是在处理简单对象,且不需要深拷贝的情况下,Object.assign 提供了一种简单方便的对象复制方式。