循环 javascript 的非常奇怪的行为
Very weird behavior for in loop javascript
正确的代码。它在控制台中打印:
1
0
https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r
66
这是非常正确的,因为只有一个 search_objects 项。
var j;
for (j=0;j< search_objects.length; j++){
console.log(j)
website = search_objects[j].website;
var rand = Math.floor(Math.random()*3)
var img_src;
switch (rand){
case 0: img_src = "res1.png"; break;
case 1: img_src = "res2.png"; break;
case 2: img_src = "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r"; break;
}
console.log(img_src);
var template_result = '<div class="owl-item " ..........div>'
console.log(search_objects[j].ID_subr)
add_carousel_item(template_result)
}
但是如果我将其更改为 for in 循环,它将再执行一次。
var j; //same thing if i declare like this: for(var j in search_objects)
for (j in search_objects){
console.log(j)
website = search_objects[j].website;
var rand = Math.floor(Math.random()*3)
var img_src;
switch (rand){
case 0: img_src = "res1.png"; break;
case 1: img_src = "res2.png"; break;
case 2: img_src = "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r"; break;
}
console.log(img_src);
var template_result = '<div class="owl-item " ..........div>'
console.log(search_objects[j].ID_subr)
add_carousel_item(template_result)
}
当 search_objects 只有一个项目时,第二种情况下的循环将执行 2 次,这通过向控制台打印对象本身及其长度来证明。
虽然这显示在控制台中。
1 //长度
0 //j
res1.png //img 来自 math.random
66 //第一项属性
唯一的 // j 的值 ??????!!!!!!!!!!!!!!!
res2.png //img 来自 math.random
undefined //似乎显示 search_objects[unique]
的 属性
注意:大多数情况下都会发生这种情况。不是100%的时候。假设当我将它作为刷新页面后我做的第一件事时,它不会发生。
有人见过这种事吗?
for...in
不仅会 return 数组元素的索引,还会 return 被迭代对象的所有可枚举属性的名称。所以它看起来像一个名为 unique
的 属性 被添加到你代码中其他地方的 search_objects
对象。
Array indexes are just enumerable properties with integer names and are otherwise identical to general Object properties. There is no guarantee that for...in will return the indexes in any particular order. The for...in loop statement will return all enumerable properties, including those with non–integer names and those that are inherited.
正确的代码。它在控制台中打印:
1
0
https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r
66
这是非常正确的,因为只有一个 search_objects 项。
var j;
for (j=0;j< search_objects.length; j++){
console.log(j)
website = search_objects[j].website;
var rand = Math.floor(Math.random()*3)
var img_src;
switch (rand){
case 0: img_src = "res1.png"; break;
case 1: img_src = "res2.png"; break;
case 2: img_src = "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r"; break;
}
console.log(img_src);
var template_result = '<div class="owl-item " ..........div>'
console.log(search_objects[j].ID_subr)
add_carousel_item(template_result)
}
但是如果我将其更改为 for in 循环,它将再执行一次。
var j; //same thing if i declare like this: for(var j in search_objects)
for (j in search_objects){
console.log(j)
website = search_objects[j].website;
var rand = Math.floor(Math.random()*3)
var img_src;
switch (rand){
case 0: img_src = "res1.png"; break;
case 1: img_src = "res2.png"; break;
case 2: img_src = "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSCFJNHQ2k1hvNCD3F9zKp9WiPooSBkjUy-ymynu1T0kmiaW-7r"; break;
}
console.log(img_src);
var template_result = '<div class="owl-item " ..........div>'
console.log(search_objects[j].ID_subr)
add_carousel_item(template_result)
}
当 search_objects 只有一个项目时,第二种情况下的循环将执行 2 次,这通过向控制台打印对象本身及其长度来证明。
虽然这显示在控制台中。
1 //长度
0 //j
res1.png //img 来自 math.random
66 //第一项属性
唯一的 // j 的值 ??????!!!!!!!!!!!!!!!
res2.png //img 来自 math.random
undefined //似乎显示 search_objects[unique]
注意:大多数情况下都会发生这种情况。不是100%的时候。假设当我将它作为刷新页面后我做的第一件事时,它不会发生。 有人见过这种事吗?
for...in
不仅会 return 数组元素的索引,还会 return 被迭代对象的所有可枚举属性的名称。所以它看起来像一个名为 unique
的 属性 被添加到你代码中其他地方的 search_objects
对象。
Array indexes are just enumerable properties with integer names and are otherwise identical to general Object properties. There is no guarantee that for...in will return the indexes in any particular order. The for...in loop statement will return all enumerable properties, including those with non–integer names and those that are inherited.