JavaScript 'for in' 语句给出不可预测的结果
JavaScript 'for in' statement giving unpredicted results
我有以下代码:
var images = document.getElementsByTagName('img');
if (screen.width > 640) {
for (var image in images) {
image = images[image];
console.log(image['src']);
}
}
页面上只有一个图像,但由于某种原因,for ... in
语句循环遍历images
三次。这是为什么呢?
示例:http://jsfiddle.net/OliverJAsh/C8egs/
您不仅要遍历元素列表,还要遍历命名方法:
-
length
-
item
-
namedItem
正确的方法是:
for (var i=0; i<images.length; i++) {
var image = images[i];
console.log(image['src']);
}
除了使用document.getElementsByTagName('img')
,还可以使用document.images
。
http://jsfiddle.net/C8egs/2/
for(var x in var)
不应该用于通过数组,因为它通过对象中的键。
如果您这样做:
for (var image in images) {
console.log(image );
}
您会注意到控制台输出将显示"长度"(以及对象上的任何其他属性(;
而是像这样使用它:
for (var i=0; i < images.length; i++) {
var image = images[i];
console.log(image['src']);
}
问题在于您的for..in
循环。for..in
循环循环遍历对象的所有可枚举属性。 getElementsByTagName
返回一个NodeList
。 除了找到的元素之外,所有nodeList
对象至少有两个附加属性:一个length
属性,包含找到的元素数,以及一个item
属性,一个以数字方式访问元素的方法(遵循 DOM 规范(。
如果要循环遍历类似数组的对象,则应改用纯for
循环:
for (var i = 0; i < images.length; i++) {
console.log(images[i].src);
}
循环不是
三次,实际上是循环四次。循环在不同的浏览器中有所不同。我在IE8和FireFox中检查了它在 fireFox 中,它循环了四次,控制台输出为
- 映像节点
- 长度
- 项目
- 命名项
在IE8中,它循环了两次
- 长度
- IMG 标记的索引位置
所以你必须纠正你的 for 循环,如下所示
var images = document.getElementsByTagName('img');
if (screen.width > 640) {
for (var i in images) {
image2 = images[i];
if(image2.nodeName == "IMG" || image2.nodeName == "img")
console.log(image2['src']);
}
}
JavaScript
的for in
迭代对象的属性,而不是数组的内容。 试试这个:
var obj = {"name": "one", "date": 10, "help": false};
for (var key in obj) {
alert(key);
}
您必须通过访问数组中项的索引来诉诸迭代。
for (var idx = 0, numImages = images.length; idx < numImages ; idx++) {
image = images[idx];
console.log(image['src']);
}
相关文章:
- JavaScript上下滚动不可预测
- $('body').height()变化不可预测
- 计算趋势线并预测未来结果
- MVC 在不可预测的时间从 razor @Helper 调用 Javascript
- 为什么纳肖恩的乐观打字会产生不可预测的结果
- 为什么 .offset() 位置是不可预测的
- javascript,forEach 和 removeChild 不可预测的行为
- 数组排序不正确/不可预测,使用 indexOf 时
- jquery's的就绪功能是不可预测的
- 组合然后排序Javascript数组.得到不可预测的结果
- 为什么Javascript异常会使解释器处于不可预测的状态
- AngularJS-使用angular.forEach和console.log循环遍历数组是不可预测的
- JavaScript 'for in' 语句给出不可预测的结果
- Google Chrome'的不可预测的行为在alert()函数
- JS/ JQuery keyup和keydown在Android设备上的不可预测行为
- ElasticSearch和不可预测的搜索文档
- 在JavaScript中按值从数组中删除项,结果不可预测
- 一段Javascript代码导致浏览器不可预测的崩溃
- gulp中不可预测的文件顺序
- 从本地文件到 Web 服务器进行 ajax 调用时不可预测的 JavaScript 执行顺序