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

tal*_*ony 4 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
}
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*ist 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);   
}
Run Code Online (Sandbox Code Playgroud)

它提供以下输出:

Object:
0
1
foo
Array:
0
1
Run Code Online (Sandbox Code Playgroud)

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