javascript - 为什么 _.extend 做一个浅拷贝?
问题描述
我查看了文档和源代码,似乎下划线的扩展方法_.extend
制作了一个浅拷贝。其中一位合作者还表示,extend 方法在这里“故意”对对象进行了浅拷贝。
现在我的问题是:为什么会这样?您能否为我提供一些这种浅拷贝会更好的场景或用例?
我试图寻找一些答案,但除了“这是一件好事”之外,我找不到太多关于这个的信息。
解决方案
深拷贝或对象克隆的计算成本非常高。_.extend
本质上只是一个别名,_.assignIn(object, [sources])
其作用与它几乎相同,_.assign
但会迭代自己和继承的源属性。原生 ES6Object.assign
不会迭代继承的源属性。
以 lodash 的文档中的示例为例assignIn
,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)
. 但请记住,与浅拷贝相比,这种深度克隆的计算成本非常高。
推荐阅读
- sql-server - 如何找出存储过程每次运行的时间
- amazon-web-services - AWS CloudFormation 堆栈:具有嵌套路径的 API Gateway 资源?
- docker - 如何协调 docker 容器之间的端口
- sql - 将 SQL 语句组合为列,而不是行
- google-sheets - 如何让谷歌表格(谷歌财经)显示最低股价在日期范围内的日期?
- spring-boot - spring-boot-maven-plugin spring-boot.run.main-class 被忽略(Groovy)
- javascript - 使本地文件保存一个可供任何用户使用的值
- ruby-on-rails - Ruby on Rails 中的多个日志文件和日志轮换
- ios - 无法安装分发版 Flutter 应用程序 .ipa(使用苹果配置器 2 甚至在 TestFlight 应用程序版本上都失败)
- python - 如何修复 TypeError:“添加”对象不可调用?