为什么javascript会更改Array.push上的数据类型?

时间:2014-01-21 04:00:50

标签: javascript

我正在研究一个简单的小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]

2 个答案:

答案 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