我正在研究一个简单的小javascript编码挑战,但遇到了一些我在任何地方都找不到的奇怪行为。也许有人可以指出我说这是预期的行为?
myIntegerArray = [1,2,3,4];
b = new Array();
for(var v in a)
{
b.push(v);
}
console.log(b); // returns ["1","2","3","4"]. Note String result
如果我要使用forEach()
,我会得到一组数字:
a.forEach(function(element,index,ay)
{
b.push(element)
});
//a console.log(b) will return [1,2,3,4]
答案 0 :(得分:5)
您正在推送键名,而不是值。你需要这样做:
b.push(a[v]);
这可能有助于您理解:
for (var key in obj) {
var value = obj[key];
arr.push(value);
}
答案 1 :(得分:2)
for(var v in a)
在JavaScript中,数组就像对象一样。 for..in
循环将获取Array对象的键,这些是实际的数组索引。我们知道,JavaScript Object键只能是字符串。所以,你实际得到的是String格式的数组索引。
不应使用for..in
的另一个原因是MDN文档。引自for..in
for..in不应该用于迭代索引顺序的数组 很重要数组索引只是可枚举的属性 整数名称,并且与一般对象相同 属性。无法保证......中将返回 任何特定顺序的索引,它将返回所有可枚举的 属性,包括具有非整数名称和属性的属性 继承的。
因为迭代的顺序是依赖于实现的,所以迭代 在数组上可能无法以一致的顺序访问元素。因此 最好使用带有数字索引的for循环(或Array.forEach 迭代数组时,或者循环的非标准) 访问顺序很重要。
所以,你要么使用
for(var index = 0; index < array.length; index += 1) {
array[index];
}
或者您在问题中显示的forEach
。