javascript - 命名数组和索引数组之间的区别 - javascript

标签 javascript arrays object

当使用数组构造函数并将一些值压入其中以及添加命名值时,会出现一些有趣的差异。

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 只会注销这两个属性。

因此,如果有人给您一个对象,该对象具有名为 010 的属性,您会称它为数组吗?没有。另一件坏事是,它还会遍历对象的原型(prototype)并列出该数组可能继承自的所有对象的属性 - 您可能不希望这样。

关于javascript - 命名数组和索引数组之间的区别 - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56549768/

相关文章:

php - 在php中将字符串转换为数组

javascript - javascript中如何阻止执行继承属性的getter setter方法

javascript - Masonry 和动态选项卡

Javascript 不正确的 header 检查解压缩 Python 生成的 zlib 缓冲区

javascript - 使用两种不同的排序条件对具有不完全相同的对象的对象数组进行排序

javascript - 如何按时间戳对数组进行排序?

php - 在提交之前通过 Javascript 进行一些表单验证是否明智?

javascript - 将包含空数组的对象数组映射为属性会忽略整个对象

c++ - 在 QMainWindow 中显示 QGridLayout

javascript - 对象方法被视为字符串