【问题标题】:Iteration over numeric Array in javascript returns strings在javascript中迭代数字数组返回字符串
【发布时间】:2013-12-13 12:06:18
【问题描述】:

为什么

for (i in [1, 2, 3]) console.log(typeof(i), i);

给出这个:

[Log] string 0
[Log] string 1
[Log] string 2

我已经预料到了数字。

@Safari 7.0 (9537.71),Mac OS X 10.9

【问题讨论】:

  • JavaScript 的 in 关键字始终用于键/属性,而不是值。 for-in 迭代密钥,in operator 检查密钥是否存在。要获取值,您需要使用property accessorarr[i]

标签: javascript


【解决方案1】:

Try instead:

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

您得到的是strings 而不是numbers,因为for..in loops 迭代键/属性(在本例中为Array 的索引)而不是值。

要获取每个键的值 i,您必须使用 property accessorarr[i]


不过,为什么要使用字符串而不是原始数字索引,因为按照当前标准,all properties are strings

console.log(Object.keys( ['foo', 'bar', 'baz'] )); // ["0", "1", "2"]

任何值实际上都可以与属性访问器一起使用,但在实际用作键/属性之前,它会被转换为ToString()

6) 让 propertyNameStringToString(propertyNameValue)。

MapsSymbols 目前计划是例外。


此外,您可能会发现“Why is using “for…in” with array iteration such a bad idea?”感兴趣,至少考虑使用简单的for 循环:

var arr = [1, 2, 3];
for (var i = 0, l = arr.length; i < l; i++)
    console.log(typeof arr[i], arr[i]);

不过,为了将来参考,即将推出的 ECMAScript 6 standard 已添加 for..of loops,它应该会按照您的预期进行迭代。

for (var i of [1, 2, 3])
    console.log(typeof i, i); // number, 1, 2, 3

【讨论】:

  • 问题是:为什么是字符串?好的,很容易猜到我得到的是“索引”而不是值。但是索引是字符串的事实非常出乎意料。现在我明白这是一个“设计错误”。 .. 感谢您的帖子,它格式正确且非常有用,但这不是我问题的确切答案。
  • @akaRem 啊。对不起。我想我把它读得更多:“why那些strings?”我添加了对“为什么是字符串?”的解释,尽管“bug by design”是一个奇怪的描述选择。我可以理解想要不同意这种行为,但它仍然是well-defined and standardized。所以,这不是一个“错误”。
  • 好吧,这只是糟糕的设计。 :)
【解决方案2】:

这是因为 Javascript 中的 Array 是一个特殊的 Object,其属性键(即字符串)用作索引。 您正在迭代 Array 就像 Object 一样,因此 i 被视为属性 key,一个字符串。

要以正确的方式迭代Array,您必须使用以下内容:

for( var i=0; i < [1,2,3].length; i++){ ... }

【讨论】:

    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多