我有这个小片段,这会给我带来一些问题:
var selectedComponents = $("#tab3 input:checked");
for (var s in selectedComponents)
我在for循环中有一个断点。该列表包含2个元素,因此首先s
为0
,然后是1
,然后是length
?
只有两个元素是正确的,但为什么length
?
答案 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;