for ... in与数组一起输出字符串而不是数字

时间:2018-08-31 10:32:25

标签: javascript ecmascript-5

var xs=[]; for (var i in [1,2,3]) xs.push(i); console.log(xs);

为什么用["0", "1", "2"]而不是[0, 1, 2]

我有预感这归结于数组内部实现。
javascript中的数组可能会被视为{"0":1, "1":2, "2":3}

编辑:我编写一个编译器。我不在乎不需要使用for in和数组。我不在乎该行的可读性。我想知道为什么数组对象的键是字符串而不是数字。从规范的任何声明,将不胜感激。

2 个答案:

答案 0 :(得分:4)

不要在数组上与in一起循环。

带有of的循环:

 var xs=[];
 for (var i of [1,2,3]) xs.push(i);
 console.log(xs);

基本上,in循环对象键,of循环数组值。 “ 0”,“ 1”和“ 2”是键。

答案 1 :(得分:3)

问题:

for...in循环并不是要遍历数组,而是旨在枚举对象键。根据{{​​3}}:

  

for...in不应用于遍历索引顺序很重要的Array。

如果与数组一起使用,则循环将数组视为对象,并将索引视为键(这样将打印出字符串化的键)。

快速解决方案:

代码的问题在于,语句for (var i in [1,2,3])在循环体中产生的数组索引为i。您可以尝试在循环体内进行简单的修复:

var xs=[]; for (var i in [1,2,3]) xs.push([1,2,3][i]); console.log(xs);

您可能希望在变量中提取[1,2,3],以使代码更具可读性。

推荐的解决方法:

改为使用docs on MDN。它是专门为循环阵列而设计的,并且在所有环境中都稳定。

var xs=[]; [1,2,3].forEach(item => xs.push(item)); console.log(xs);