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

为什么javascript会更改Array.push上的数据类型?,javascript,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.forEac

我当时正在做一个简单的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]

您正在按的是键名,而不是值。您需要这样做:

b.push(a[v]);
这可能有助于您理解:

for (var key in obj) {
  var value = obj[key];
  arr.push(value);
}
在JavaScript中,数组就像对象一样
for..in
循环将获取数组对象的键,这些键是实际数组索引。众所周知,JavaScript对象键只能是字符串。因此,您实际得到的是字符串格式的数组索引

另一个不应该在中使用的原因是在MDN文档中。引用

for..in不应用于迭代索引顺序为 这很重要。数组索引只是具有 整数名和在其他方面与常规对象相同 财产。不能保证for…in会退还 索引的任何特定顺序,它将返回所有可枚举的 属性,包括具有非整数名称的属性和 继承的

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

所以,你要么使用

for(var index = 0; index < array.length; index += 1) {
    array[index];
}
for(变量索引=0;索引

或者您在问题本身中显示的
forEach

duh!谢谢你帮我解决这个问题!您的代码不会生成该输出。数组将是零索引的,而不是一索引的。啊,你说得对。我又看了一遍我的成绩,结果就是这样。我本应该把我包括进去的,但我被明显的类型改变分心了,完全错过了。
for(var index = 0; index < array.length; index += 1) {
    array[index];
}