我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?
当前回答
截至2016年(ES6),我们可能会使用for…for数组迭代,正如John Slegers已经注意到的那样。
我只想添加一个简单的演示代码,以使事情更清楚:
Array.prototype.foo = 1;
var arr = [];
arr[5] = "xyz";
console.log("for...of:");
var count = 0;
for (var item of arr) {
console.log(count + ":", item);
count++;
}
console.log("for...in:");
count = 0;
for (var item in arr) {
console.log(count + ":", item);
count++;
}
控制台显示:
for...of:
0: undefined
1: undefined
2: undefined
3: undefined
4: undefined
5: xyz
for...in:
0: 5
1: foo
换句话说:
对于的计数从0到5,并且还忽略Array.prototype.foo。它显示数组值。对于中只列出了5个,忽略了未定义的数组索引,但添加了foo。它显示数组属性名称。
其他回答
有三个原因你不应该使用。。在中迭代数组元素:
对于in将循环遍历数组对象的所有自己和继承的财产,这些属性不是DontEnum;这意味着,如果有人将财产添加到特定数组对象(这有合理的原因-我自己做过)或更改array.prototype(这在代码中被认为是错误的做法,应该与其他脚本一起工作),这些财产也会被迭代;通过检查hasOwnProperty()可以排除继承的财产,但这对数组对象本身中设置的财产没有帮助对于中不能保证保留元素顺序它的速度很慢,因为您必须遍历数组对象的所有财产及其整个原型链,并且仍然只能获取属性的名称,即要获取值,需要进行额外的查找
因为它通过对象字段而不是索引枚举。你可以用索引“length”获得值,我怀疑你是否想要这个。
由于JavaScript元素保存为标准对象财产不建议使用for…遍历JavaScript数组。。。在里面循环,因为普通元素和所有可枚举的财产上市的
从…起https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections
一个重要的方面是。。。in-only迭代包含在对象中的财产,该对象的可枚举属性属性设置为true。因此,如果尝试使用for对对象进行迭代。。。然后,如果任意财产的可枚举属性为false,则可能会丢失这些属性。很有可能更改普通Array对象的可枚举属性属性,以便不枚举某些元素。虽然一般来说,属性属性倾向于应用于对象中的函数财产。
可以通过以下方式检查财产的可枚举属性属性的值:
myobject.propertyIsEnumerable('myproperty')
或获取所有四个属性属性:
Object.getOwnPropertyDescriptor(myobject,'myproperty')
这是ECMAScript 5中提供的一个特性——在早期版本中,无法更改可枚举属性属性的值(它总是设置为true)。
我认为我没有什么要补充的,比如Triptych的答案或CMS关于为什么使用for。。。在某些情况下应避免。
然而,我想补充一点,在现代浏览器中,有一种替代。。。在这种情况下。。。无法使用中的。另一种选择是。。。第页,共页:
for (var item of items) {
console.log(item);
}
注:
遗憾的是,没有版本的Internet Explorer支持。。。(Edge 12+确实如此),因此您必须等待一段时间,直到可以在客户端生产代码中使用它。然而,在服务器端JS代码中使用它应该是安全的(如果您使用Node.JS)。