为什么_.extend会生成浅层副本?

时间:2018-06-14 08:40:06

标签: javascript underscore.js

我查看了文档和源代码,看起来下划线的扩展方法_.extend生成了浅层副本。其中一位合作者还表示,extend方法会对“故意”here执行对象的浅层复制。

现在我的问题是:为什么这样做?你能不能给我一些情节或用例,这个浅层副本会更好?

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

1 个答案:

答案 0 :(得分:1)

深层副本或对象克隆的计算成本非常高。 _.extend基本上只是_.assignIn(object, [sources])的别名,它与_.assign几乎完全相同,但是迭代自己和继承的源属性。本机ES6 Object.assign不会迭代继承的源属性。

assignIn上的lodash文档为例,Object.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)。但请记住,与浅拷贝相比,这种深度克隆非常<强>计算成本高。

相关问题