我查看了文档和源代码,看起来下划线的扩展方法_.extend
生成了浅层副本。其中一位合作者还表示,extend方法会对“故意”here执行对象的浅层复制。
现在我的问题是:为什么这样做?你能不能给我一些情节或用例,这个浅层副本会更好?
我试图寻找一些答案,除了“这是一件好事”之外,我找不到太多关于此的事。
答案 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 }
如您所见,还继承了源继承的源属性(通过原型设置),即b
和d
。
如果要深度克隆对象,可以使用_.cloneDeep(value)
。但请记住,与浅拷贝相比,这种深度克隆非常<强>计算成本高。