【问题标题】:Why does the typeof a numerical array index in a "for..in" loop considered a string? [duplicate]为什么“for..in”循环中的数字数组索引的类型被视为字符串? [复制]
【发布时间】:2013-10-09 21:47:24
【问题描述】:

我注意到在 Javascript 中用作for..in 循环中的索引的变量将始终是string,即使我按以下方式定义它:

var s_array = new Array();
s_array[0] = 'foo';
s_array[1] = 'bar';

for(i in s_array){
 alert(typeof(i)); // String
}

为什么它被认为是string 而不是number

【问题讨论】:

    标签: javascript typeof for-in-loop array-key


    【解决方案1】:

    for(x in y) 语法旨在遍历对象的属性(不是数组的索引),并且属性名称始终存储为字符串。

    它也适用于数组这一事实是数组元素作为数组对象上的属性的副作用。

    要了解区别,请考虑以下代码:

    var s_array = new Array();
    s_array[0] = 'foo';
    s_array[1] = 'bar';
    s_array['foo'] = 'bar';
    
    console.log("Object:");
    for(i in s_array) {
     console.log(i);   
    }
    console.log("Array:");
    for(var i = 0, l = s_array.length; i < l; i++) {
     console.log(i);   
    }
    

    提供以下输出:

    Object:
    0
    1
    foo
    Array:
    0
    1
    

    对象上有一个foo 属性,但它实际上不是数组中的元素。

    【讨论】:

    • 我觉得你的措辞有点混乱:数组索引没有“映射”到属性,数组元素属性。数组和其他对象一样,没有什么特别之处。
    • @thg435 好点,已编辑。我试图表明作为属性的数组元素与对象上设置的其他属性之间存在细微差别,但绝对可以更好地措辞。
    • 首先感谢大家的回答,所以当我在幕后询问 s_array[1] 时.. 数字 1 转换为字符串?
    【解决方案2】:

    数组本质上是具有托管索引键集的对象。

    由于对象中的每个键都是字符串类型,因此它也是字符串。

    将您的数组视为:

    {"0" : "foo" , "1" : "bar"}
    

    所以你的

    for(i in s_array){ alert(typeof(i)); }
    

    可以读作

    对于 s_array 中的每个键

    【讨论】:

      【解决方案3】:

      在 js 中,数组是高级的、类似列表的对象(关联数组)。

      索引最终会被 JavaScript 引擎强制转换为字符串,无论如何,通过隐式的 toString 转换。

      来源:MDN

      【讨论】:

        猜你喜欢
        • 2020-12-24
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多