【问题标题】:Why does javascript turn array indexes into strings when iterating?为什么javascript在迭代时会将数组索引变成字符串?
【发布时间】:2009-12-11 06:24:58
【问题描述】:

这个 Javascript 逻辑让我感到困惑。我正在创建一个数组并将它的第一个元素设置为一个数字。当我使用“for”循环进行交互时,Javascript 会将数组键转换为字符串。为什么?我希望它保持一个数字。

stuff = [];
stuff[0] = 3;

for(var x in stuff) {
    alert(typeof x);
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这是因为您使用 for...in 循环遍历数组,这通常用于循环对象的属性。 javascript 引擎可能正在转换为字符串,因为字符串类型适用于对象属性的名称。

    试试这个更传统的方法:

    stuff = [];
    stuff[0] = 3;
    
    for(var i=0; i<stuff.length; i++) {
        var x = stuff[i];
        alert(typeof x);
    }
    

    【讨论】:

    • 感谢 Asaph 的快速帮助!
    • @Mike Cantelon:没问题 :)
    【解决方案2】:

    for..in 不是为遍历数组而设计的。请改用 C 风格的 for 循环。

    参考:MDC

    【讨论】:

      【解决方案3】:

      Javascript 中的for .. in 循环遍历对象的属性。在 Javascript 中,属性名称是字符串,而数组只是具有一堆看起来像数字的属性的对象。

      【讨论】:

        【解决方案4】:

        for...in 语句应该用于迭代对象属性,对于数组使用简单的for 循环:

        var stuff = [];
        stuff.push(3);
        
        for(var i = 0; i < stuff.length; i++) {
          alert(stuff[i]);
        }
        

        为什么不应该将for...in 与数组一起使用?

        1. 它沿着原型链向上爬,它将迭代在Array.prototypeObject.prototype 中定义的属性。
        2. 无论如何保证迭代的顺序。

        有关最近回答的问题的更多详细信息:

        【讨论】:

          【解决方案5】:

          避免在performance-critical 函数中使用for-in。

          • The for-in loop requires the script engine to build a list of all the enumerable properties,并检查该列表中的重复项,然后才能开始枚举。
          • The for-in loop breaks when you extend Array object using prototype.

          【讨论】:

            【解决方案6】:

            问题在于,在 JavaScript 中切换到关联数组非常容易,关联数组实际上不是数组而是对象。但是,for..in 循环适用于对象,其索引是字符串。

            【讨论】:

              猜你喜欢
              • 2020-08-21
              • 1970-01-01
              • 2016-05-24
              • 2019-10-12
              • 1970-01-01
              • 1970-01-01
              • 2022-11-18
              • 1970-01-01
              • 2011-02-25
              相关资源
              最近更新 更多