for ... in with array输出字符串而不是数字

问题描述 投票:0回答:2
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和数组。我不关心线路的可读性。我想知道为什么数组对象的键是字符串而不是数字。任何来自规范的声明都将受到赞赏。

javascript ecmascript-5
2个回答
4
投票

不要在数组上使用in循环。

循环与of

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

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


3
投票

问题:

for...in循环不是为了迭代数组,而是设计用于枚举对象键。根据docs on MDN

for...in不应该用于迭代索引顺序很重要的数组。

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

快速修复:

您的代码问题是语句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]以使代码更具可读性。

推荐的修复:

请改用Array#forEach。它专门设计用于循环遍历数组,并且在所有环境中都是稳定的。

var xs=[]; [1,2,3].forEach(item => xs.push(item)); console.log(xs);
© www.soinside.com 2019 - 2024. All rights reserved.