首页 > 解决方案 > 为什么 Object.assign 适用于数组?

问题描述

所以我正在阅读一篇文章来克隆一个对象和数组。他们都提到 Object.assign() 可用于复制对象,但没有人提到 Object.assign() 也可用于浅复制数组。

有人可以解释它是如何工作的吗?

Code to Explain is in JS Bin : https://jsbin.com/kaqocixize/edit?js,console

标签: javascriptarraysobjectcopyshallow-copy

解决方案


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


推荐阅读