4

I noticed that in Javascript a variable used as the index in a for..in loop will be always a string even if I define it the following way:

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

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

Why is it considered a string and not a number?

4

3 回答 3

9

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

于 2013-10-03T09:07:27.723 回答
2

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

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

将您的数组视为:

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

所以你的

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

可以读作

对于 s_array 中的每个键

于 2013-10-03T09:07:15.933 回答
2

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

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

来源:MDN

于 2013-10-03T09:10:37.540 回答