因此,我正在阅读一篇文章,以克隆对象和数组。他们所有人都提到Object.assign()可用于复制对象,但没有人提到Object.assign()也可用于浅复制数组。
有人可以解释它是如何工作的吗?
Code to Explain is in JS Bin :
https://jsbin.com/kaqocixize/edit?js,console
答案 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
能够解释和处理这一点。这是另一个问题,提供了一些可靠的答案,应该可以帮助您理解这一点。
答案 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']);