【问题标题】:Why for var in array returns a string index? [duplicate]为什么 for var in array 返回一个字符串索引? [复制]
【发布时间】:2014-11-08 17:07:48
【问题描述】:

我真的很惊讶,在 Javascript 中:

> vals = ["a", "b", "c"]
> for (v in vals) console.log(v + 1)
01 
11 
21 

这是因为:

> for (v in vals) console.log(typeof(v))
string
string
string

所以我不得不这样做:

> for (v in vals) console.log(parseInt(v) + 1)
1 
2 
3 

为什么会这样?

我知道我能做到

> for (var v = 0; v < vals.length; v++) console.log(v + 1)
1 
2 
3 

但在与 python 一起使用时,我的想法是 for ... in ... 迭代

【问题讨论】:

  • "...但是与 python 一起使用我的想法是 for ... in ... 迭代" Python 在这里无关紧要。这是 JavaScript。所有对象属性都是字符串。使用for 循环。
  • ...在 JS 中有几个原因对我们来说是 for 而不是数组上的 for-in。但是,如果您真的想这样做,可以将其缩短为console.log(+v + 1);

标签: javascript arrays iteration


【解决方案1】:

我的朋友,看看原型继承的奇迹和诅咒吧。你用for..in 迭代的不是数组。您正在迭代一个 Array 对象。看看文档:

数组索引只是具有整数名称的可枚举属性,并且 在其他方面与一般对象属性相同。没有 保证 for...in 将返回任何特定的索引 order,它将返回所有可枚举的属性,包括那些 具有非整数名称和继承的名称。

因为迭代的顺序是依赖于实现的,迭代 在一个数组上可能不会以一致的顺序访问元素。所以 最好使用带有数字索引的 for 循环(或 Array.forEach 或 for...of 循环)在迭代数组时 访问很重要。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

所以您要处理的是 Array 对象中属性的可枚举“整数名称”,而不是数字顺序。

EDIT JavaScript 中的for v in array 不等同于python 中的for v in list。它等同于for k, v in dict.iteritems(),但 k 隐含地作为具有整数名称的字符串给您,可以说,即“1”、“2”、“3”等。我认为从 OO 的角度来看这也是违反直觉的.列表/数组如何成为类似字典的对象?但从原型的角度来看,只要继承自Object.prototype,它就可以被视为具有键和属性的对象。

【讨论】:

  • 非常感谢,这真的解释了。
猜你喜欢
  • 2017-04-14
  • 2013-04-09
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2016-10-16
相关资源
最近更新 更多