JavaScript 数组如何具有非数字键?

Hay*_*den 4 javascript arrays object

我学到的是数组是一种对象。对象是具有键/值对的属性集合。我一直认为数组是从 0 开始数字索引的项目的集合。就在最近,我能够向数组添加一个非数字键。

let arr = ['cribriform plate','mastoid','hyoid'];
arr.eyes = 'brown';
arr.skin = 'white';
Run Code Online (Sandbox Code Playgroud)

这导致

['cribriform plate','mastoid','hyoid',eyes : 'brown', skin : 'white'];
Run Code Online (Sandbox Code Playgroud)

arr 的 for...in 循环产生了:

for(let i in arr){
    console.log(i);
    //0,1,2,3,eyes,skin
}
Run Code Online (Sandbox Code Playgroud)

for...of 循环产生:

for(let i of arr){
     console.log(i);
     //0,1,2,3
}
Run Code Online (Sandbox Code Playgroud)

我能够使用 for...in 循环遍历数组的所有键。但是,当我使用 for...of 循环时,我只能迭代数字索引键。这是为什么?

而且,数组最准确的定义是什么?

Cer*_*nce 7

通过for..of循环,对象的Symbol.iterator属性被调用。在数组的情况下,这相当于数组的.values()方法,它包含数组中每个索引的值。非数字属性不包括-阵列通常不具有任意的非数字属性和代码确实分配任意的非数字属性到阵列可能需要重构的。

for..in遍历对象,包括那些来自原型继承所有枚举的属性。因此,for..of在数组上将排除for..in循环将包括的数组上的非数字属性。

数组作为对象,可以为它们分配任意属性,在大多数情况下,就像可以将属性分配给普通函数一样 - 这不是一个很好的主意。