当使用数组构造函数并将一些值压入其中以及添加命名值时,会出现一些有趣的差异。
let arr = []
arr.push('a')
arr.push('b')
arr.push('c')
arr.foo1 = 'bar1'
arr.foo2 = 'bar2'
arr.forEach 和 for of 仅迭代索引值,而 for in 迭代索引/键值。
我想我想知道的是为什么会有人使用它? 从对象和数组中获得的一件很酷的事情是保证键值对的顺序
(不仅仅是 [{key:'value'}, {key2: 'value2'] 而是你可以在对象上使用 for of 的东西,其中顺序将基于对象键的顺序设置。我知道那是不可能的,但只是建议在对象和数组之间获得一些很好的东西)
但似乎无法迭代键值的顺序,因此不能保证顺序(除非我错了) 这样做似乎是对象和数组之间的混合,但是当您可以以通用方式创建对象或数组时,为什么还要混合呢?
最佳答案
数组与您创建的任何其他对象一样,都是 JavaScript 对象。 (几乎)JavaScript 中的所有内容都从 Object
继承其原型(prototype).
现在数组的规范使得索引基本上只是专门命名的属性。 a[1]
和 a['1']
指向同一个属性。唯一额外的事情是你必须有一个 length
数字属性。在 words of ECMAScript language specification , “数组对象是对特定类别的属性名称给予特殊处理的奇异对象”。
现在,forEach
被定义为一个函数,它只会循环遍历 Array 实例具有的那些“特殊”属性。它以 0
开始,以 length - 1
结束,并跳过未定义的值。它不看其他 Prop 。所以你只能得到数组中的字段。
for of
是一个 iterator - 如果你有一个 iterable
对象,你基本上得到它的迭代器函数,然后循环它给你的值。一个可迭代的数组只给出那些索引的属性名称。你可以多读一点over at MDN .
再一次强调,数组和其他对象一样是对象,但是我们赋予它的一些属性特殊的含义,并且它从 Array 原型(prototype)继承了一些可以处理这些属性的函数。
但是for in
并不关心这个对象是否特殊。 它会简单地遍历你给它的任何对象的所有属性,包括一个数组。这就是为什么当你for in
循环对象时,你是在循环对象的属性,和数组索引包含在其中。
注意:不推荐使用 for ... in ...
。 例如在稀疏数组中(您设置的位置,例如 a[0] = 1,a[10] = 1,并保留所有其他索引未定义),for in
只会注销这两个属性。
因此,如果有人给您一个对象,该对象具有名为 0
和 10
的属性,您会称它为数组吗?没有。另一件坏事是,它还会遍历对象的原型(prototype)并列出该数组可能继承自的所有对象的属性 - 您可能不希望这样。
关于javascript - 命名数组和索引数组之间的区别 - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56549768/