为什么Object.assign使用数组?

时间:2018-11-16 16:49:51

标签: javascript arrays object copy shallow-copy

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

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

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

3 个答案:

答案 0 :(得分:3)

JS是面向原型的语言。 这意味着JS中的每个构造实际上都是一个对象! :)

对象在某些元数据中有所不同,例如具体属性。这些通常是只读的,没有覆盖它们的简便方法(例如length, name, arguments等)。

在您的情况下,数组可以解释为特定的对象,其中length与数组元素的数量有关,每个数组元素与使用索引作为键的对象的属性有关:

const array = {
  '0': 'a',
  '1': 'b',
  '2': 'c',
  'length': 3,
};

(这很简单,因为我们仍然缺少用于迭代的生成器,通常将其保留为Symbol)。

JS隐藏这些特殊属性的方式通常是通过使用符号-在此处进行更多的介绍:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol

但是,由于JS的原型性质,当使用Object.assign时,将Array视为对象,因此可以通过执行以下操作:

Object.assign([],a,['x']); 

您实际上是在创建一个新数组 AND ,并用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

答案 1 :(得分:1)

数组确实是Javascript中的对象,它们具有一些自身的区别和特征,因此Object.assign能够解释和处理这一点。这是另一个问题,提供了一些可靠的答案,应该可以帮助您理解这一点。

Are Javascript arrays primitives? Strings? Objects?

答案 2 :(得分:0)

正如Mark Meyer的评论所说,数组是对象。

具体来说,数组是一个对象,其键是代表小整数的字符串。处理添加或删除值时如何更新length以及更新length时如何删除值有一些魔术。除此之外,它是对象的核心。

因此,在此代码中(请在您的问题中包含这样的代码,而不是指向外部站点):

var a = ['a','b','c']; 
var b = Object.assign([], a, ['x']);

发生的所有事情是,它采用传递的初始值[],然后将a中的属性添加到其上,这些属性的键为'0''1' ,和'2',分别具有'a''b''c'的值,然后将['x']中的属性添加到其上,唯一的一个是密钥{具有值'0'的{​​1}},产生'x'

所以这是简单的对象处理。

请注意,如果您这样做

['x', 'b', 'c']

您将获得Object.assign([], a, [, 'x']); ,如果您获得了

['a', 'x', 'c']

您将获得Object.assign([], a, [, , , , 'x']);