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

Why does the typeof a numerical array index in a "for..in" loop considered a string?

本文关键字:类型 索引 字符串 数组 数字 in for 循环 为什么      更新时间:2023-09-26

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

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

数组

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

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

将您的阵列视为:

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

所以你的

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

可以理解为

对于s_array中的每个键

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

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

来源: MDN