Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript数组如何具有非数字键?_Javascript_Arrays_Object - Fatal编程技术网

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

JavaScript数组如何具有非数字键?,javascript,arrays,object,Javascript,Arrays,Object,我学到的是数组是一种对象。对象是具有键/值对的属性集合。我一直认为数组是从0开始的数字索引项的集合。就在最近,我能够将非数字键添加到数组中 let arr = ['cribriform plate','mastoid','hyoid']; arr.eyes = 'brown'; arr.skin = 'white'; 这导致了 ['cribriform plate','mastoid','hyoid',eyes : 'brown', skin : 'white']; arr的for…in循环

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

let arr = ['cribriform plate','mastoid','hyoid'];
arr.eyes = 'brown';
arr.skin = 'white';
这导致了

['cribriform plate','mastoid','hyoid',eyes : 'brown', skin : 'white'];
arr的for…in循环产生:

for(let i in arr){
    console.log(i);
    //0,1,2,3,eyes,skin
}
for…of循环产生了:

for(let i of arr){
     console.log(i);
     //0,1,2,3
}
我能够使用for…in循环遍历数组的所有键。然而,当我使用for…of循环时,我只能迭代数字索引键。为什么呢


还有,数组最准确的定义是什么?

使用
for..of
循环,对象的
符号。调用迭代器
属性。对于数组,这相当于数组的
.values()
方法。不包括非数值属性-数组通常不具有任意非数值属性,并且为数组指定任意非数值属性的代码可能需要重构

A
for..in
循环对象上的所有可枚举属性,包括从原型继承的属性。因此,
for..of
在一个数组中将排除
for..in
循环将包括的数组中的非数字属性


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

数组是javascript中的一种对象。当您执行类似于
arr.skin='white'的操作时,基本上是为数组的对象属性集合设置一个变量。这就是为什么您可以在
for…of
中访问它,它会迭代对象的可枚举属性

但是,由于此新属性不是数组元素列表的一部分,因此无法通过
for…in

摘自:

使用括号表示法(或点表示法)通过非整数进行设置或访问不会从数组列表本身设置或检索元素,但会设置或访问与该数组的对象属性集合关联的变量。数组的对象属性和数组元素列表是分开的,数组的遍历和变异操作不能应用于这些命名属性


您好,@hayden,您还会添加到数组吗?您说过for…in循环会迭代对象的所有属性,包括继承的属性,但继承的大多数方法和属性不是不可枚举的吗?那么,这是否构成了数字索引键的属性?对于数组,是的。它有许多继承自其原型的方法(如
.forEach
.join
),也继承自
对象
,该对象提供了
.hasOwnProperty
.valueOf
等方法。但所有这些都是不可枚举的。在普通数组上,默认情况下它没有可枚举属性-它将拥有的唯一可枚举属性是数组标记或碰巧被分配到的任意属性(这不是一个好主意)。