首页 > 解决方案 > 为什么 _.extend 做一个浅拷贝?

问题描述

我查看了文档和源代码,似乎下划线的扩展方法_.extend制作了一个浅拷贝。其中一位合作者还表示,extend 方法在这里“故意”对对象进行了浅拷贝。

现在我的问题是:为什么会这样?您能否为我提供一些这种浅拷贝会更好的场景或用例?

我试图寻找一些答案,但除了“这是一件好事”之外,我找不到太多关于这个的信息。

标签: javascriptunderscore.js

解决方案


深拷贝或对象克隆的计算成本非常高。_.extend本质上只是一个别名,_.assignIn(object, [sources])其作用与它几乎相同,_.assign但会迭代自己和继承的源属性。原生 ES6Object.assign不会迭代继承的源属性。

以 lodash 的文档中的示例为例assignInObject.assign将为您提供以下输出:

function Foo() {
  this.a = 1;
}

function Bar() {
  this.c = 3;
}

Foo.prototype.b = 2;
Bar.prototype.d = 4;

console.log(Object.assign({ 'a': 0 }, new Foo, new Bar));
// { a: 1, c: 3 }

鉴于_assignIn_.extend给你

// { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }

如您所见,也继承了源属性(通过原型设置),即bd,也被迭代了。

如果你想深度克隆一个对象,你可以使用_.cloneDeep(value). 但请记住,与浅拷贝相比,这种深度克隆的计算成本非常高。


推荐阅读