为什么“for..in”循环中的数值数组索引的类型被视为字符串?

时间:2013-10-03 09:03:49

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

我注意到在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

3 个答案:

答案 0 :(得分:8)

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属性,但它实际上并不是数组中的元素。

答案 1 :(得分:2)

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

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

将您的数组视为:

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

所以你的

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

可以读作

  

表示s_array中的每个键

答案 2 :(得分:2)

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

无论如何,

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

来源:MDN