javascript - 为什么 Object.assign 适用于数组?
问题描述
所以我正在阅读一篇文章来克隆一个对象和数组。他们都提到 Object.assign() 可用于复制对象,但没有人提到 Object.assign() 也可用于浅复制数组。
有人可以解释它是如何工作的吗?
Code to Explain is in JS Bin :
https://jsbin.com/kaqocixize/edit?js,console
解决方案
JS 是面向原型的语言。这意味着 JS 中的每个构造实际上都是一个对象!:)
对象在某些元数据中有所不同,例如特定属性。这些通常是只读的,并且没有简单的方法可以覆盖它们(例如length, name, arguments
,还有更多)。
在您的情况下,数组可以解释为length
与数组元素的数量相关的特定对象,并且每个数组元素与使用索引作为键的对象的属性相关:
const array = {
'0': 'a',
'1': 'b',
'2': 'c',
'length': 3,
};
(这是简化,因为我们仍然缺少用于迭代的生成器,通常保留为符号)。
JS 隐藏这些特殊属性的方式通常是使用符号 - 更多关于它们的信息:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
然而,由于 JS 的原型性质,当使用Array 时Object.assign
,Array 被视为一个对象,因此,通过执行以下操作:
Object.assign([],a,['x']);
您实际上是在创建一个新数组并0
使用'x'
. 这就是在对象世界中如何解释这条线:
Object.assign({}, {
'0': 'a',
'1': 'b',
'2': 'c',
}, {
'0': 'x'
});
这就是x
作为新数组的第一个索引的方式!
但是,ES5 和 ES6 之间的 Array 实现存在一些差异 - 更多内容在这里:http: //2ality.com/2014/05/es6-array-methods.html
推荐阅读
- c++ - 像打包一样获取聚合的大小
- angular - Angular 中的 html2canvas - 无法调用类型缺少调用签名的表达式
- python - 在python中正确读取docx文件
- amazon-ec2 - 使用 AWS_PING 在 EC2 上为 HA 配置 Wildfly 15
- c# - 列出主目录和子目录中的文件
- android - 即使 appAutoUpdatePolicy 设置为 ALWAYS,应用程序也不会更新
- python - 在 Flask 工厂设置中反映不同的数据库
- oracle - 如何避免 Oracle Ref 游标
- javascript - 我想应用过滤器:模糊到任何形状
- c# - 如何为多个测试类创建多个范围报告