为什么
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
答案 0 :(得分:4)
var arr = [1, 2, 3];
for (var i in arr)
console.log(typeof arr[i], arr[i]);
你得到string
而不是number
因为for..in
loops迭代键/属性(在这种情况下是Array
的索引)而不是值。
要获取每个密钥i
的值,您必须使用property accessor,arr[i]
。
但是,为什么字符串根本不是原始数字索引是因为,按照现行标准,all properties are strings。
console.log(Object.keys( ['foo', 'bar', 'baz'] )); // ["0", "1", "2"]
任何值实际上都可以与属性访问器一起使用,但在它实际用作键/属性之前,它将被转换为ToString()
。
6)让 propertyNameString 为ToString( propertyNameValue )。
Map
s和Symbol
目前计划作为例外。
此外,您可能会发现感兴趣的“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
答案 1 :(得分:2)
这是因为Javascript中的Array
是一个特殊的Object
,其属性键(字符串)用作索引。
您正在将Array
与Object
进行迭代,因此i
被视为属性key
,是一个字符串。
要以正确的方式迭代Array
,您必须使用以下内容:
for( var i=0; i < [1,2,3].length; i++){ ... }