我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?
当前回答
因为它通过对象字段而不是索引枚举。你可以用索引“length”获得值,我怀疑你是否想要这个。
其他回答
因为它通过对象字段而不是索引枚举。你可以用索引“length”获得值,我怀疑你是否想要这个。
原因是一个构造:
变量a=[];//创建新的空数组。a[5]=5;//调整数组大小的完全合法的JavaScript。对于(var i=0;i<a.length;i++){//按照每个人的预期,在从0到5的数字索引上重复。控制台日志(a[i]);}/*将显示:未定义未定义未定义未定义未定义5.*/
有时可能完全不同:
变量a=[];a[5]=5;for(a中的var x){//仅显示显式设置的索引“5”,并忽略0-4console.log(x);}/*将显示:5.*/
还要考虑JavaScript库可能会这样做,这会影响您创建的任何数组:
//在JavaScript库的深处。。。Array.prototype.foo=1;//现在你不知道下面的代码会做什么。变量a=[1,2,3,4,5];for(a中的var x){//现在foo是每个数组的一部分//将在此处显示为“x”值。console.log(x);}/*将显示:01.2.3.4.食品*/
以下是这种做法(通常)不好的原因:
对于in循环迭代它们自己的所有可枚举财产及其原型的可枚举财产。通常在数组迭代中,我们只需要迭代数组本身。即使您自己可能没有向数组中添加任何内容,但您的库或框架可能会添加一些内容。
例子:
Array.prototype.hithere=“此处”;var数组=[1,2,3];for(let el in array){//hithere属性也将被迭代控制台日志(el);}
对于in循环不能保证特定的迭代顺序。尽管现在大多数现代浏览器中通常都能看到isorder,但仍然没有100%的保证。对于in循环忽略未定义的数组元素,即尚未分配的数组元素。
例子::
常量arr=[];arr[3]=“foo”;//将阵列大小调整为4arr[4]=未定义;//添加另一个未定义值的元素//遍历数组,for循环确实显示了未定义的元素for(设i=0;i<arr.length;i++){控制台日志(arr[i]);}console.log('\n');//for in忽略未定义的元素for(let el in arr){控制台日志(arr[el]);}
我认为我没有什么要补充的,比如Triptych的答案或CMS关于为什么使用for。。。在某些情况下应避免。
然而,我想补充一点,在现代浏览器中,有一种替代。。。在这种情况下。。。无法使用中的。另一种选择是。。。第页,共页:
for (var item of items) {
console.log(item);
}
注:
遗憾的是,没有版本的Internet Explorer支持。。。(Edge 12+确实如此),因此您必须等待一段时间,直到可以在客户端生产代码中使用它。然而,在服务器端JS代码中使用它应该是安全的(如果您使用Node.JS)。
for/in使用两种类型的变量:哈希表(关联数组)和数组(非关联)。
JavaScript将自动确定其通过项目的方式。因此,如果您知道数组确实是非关联的,可以使用(var i=0;i<=arrayLen;i++),并跳过自动检测迭代。
但在我看来,最好使用for/in,自动检测所需的过程非常小。
对此的真正答案将取决于浏览器解析器/解释JavaScript代码的方式。它可以在浏览器之间更改。
我想不出不使用for/in的其他目的;
//Non-associative
var arr = ['a', 'b', 'c'];
for (var i in arr)
alert(arr[i]);
//Associative
var arr = {
item1 : 'a',
item2 : 'b',
item3 : 'c'
};
for (var i in arr)
alert(arr[i]);