代码之家  ›  专栏  ›  技术社区  ›  Hayden

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

  •  0
  • Hayden  · 技术社区  · 6 年前

    我学到的是数组是一种对象类型。对象是具有键/值对的属性集合。我一直认为数组是从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循环时,我只能够遍历数字索引键。为什么会这样?

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    用一个 for..of 循环,对象的 Symbol.iterator 属性被调用。对于数组,这相当于数组的 .values() 方法,其中 contains the values for each index in the array . 不包括非数字属性-数组通常不具有任意的非数字属性,并且代码 将任意非数字属性赋给数组可能需要重构。

    for..in iterates over 对象上的所有可枚举属性,包括从原型继承的属性。因此, 为了… 在数组上,将排除 在…中 循环将包括。

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

        2
  •  1
  •   Fábio Peres Toi    6 年前

    数组是JavaScript中的对象类型。当你做类似的事情时 arr.skin = 'white'; ,基本上是为数组的对象属性集合设置一个变量。这就是为什么你可以在 for...of 循环访问对象的可枚举属性。

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

    取自 MDN web docs for Arrays :

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