数组索引变为“长度”?

时间:2017-09-21 20:04:40

标签: javascript jquery

我有这个小片段,这会给我带来一些问题:

var selectedComponents = $("#tab3 input:checked");

for (var s in selectedComponents)

我在for循环中有一个断点。该列表包含2个元素,因此首先s0,然后是1,然后是length

只有两个元素是正确的,但为什么length

2 个答案:

答案 0 :(得分:2)

因为for in循环将为您提供标有属性属性enumerable的所有属性。在你的情况下,你没有一个数组,但jQuery数组就像对象。对于数组,它将为您提供可枚举的索引和其他属性。

不要使用for in循环迭代数组。使用for of (ES6) Array.forEach() (ES5.1) 或简单for循环



const array = [1,2,3];

// With for of
for(let item of array) {
   console.log(item);
}
 
// With forEach method
array.forEach(item => console.log(item));




答案 1 :(得分:0)

如前所述,PolyModel循环用于循环具有for/in数据结构的对象。键是表示属性名称的字符串,值是使用这些键存储的实际数据。

来自 MDN

  

for ... in循环只迭代可枚举的属性。对象   从像Array和Object这样的内置构造函数创建的   从Object.prototype和。继承的非可枚举属性   String.prototype,例如String的indexOf()方法或Object&#39   toString()方法。循环将遍历所有可枚举的循环   对象本身的属性以及对象从其继承的属性   构造函数的原型(更接近于对象的属性)   原型链覆盖原型'属性)。

数组没有基于字符串的键,它有数字索引,因此,key/value循环不应该用来迭代它,因为它将循环遍历 all 配置为可枚举的对象的属性。正如您所看到的那样,索引以及for/in



length




对于数组,您应该使用传统的计数类型循环进行循环:



var myArray = ["Monday", "Tuesday", "Wednesday"];

// for/in loops loop over the string key names of an object
// Arrays don't have these, so their indexes are coverted to strings
// This is not only slower than numeric access, but this type of loop
// iterates all the properties (keys), not just the indexes.
for(var item in myArray) {
  console.log(myArray[item], "(Enumertor is a: " + typeof item + ")");
}




或者,更好(因为你不必混淆计数器) Array.forEach() 方法:



var myArray = ["Monday", "Tuesday", "Wednesday"];

// With a counting loop, you only iterate over the indexes
// and you do it with number types (faster than strings)
for(var i = 0; i < myArray.length; i++) {
  console.log(myArray[i], "(Enumertor is a: " + typeof i + ")");
}
&#13;
&#13;
&#13;