详解javascript遍历方式


Posted in Javascript onNovember 11, 2015

为了方便例子讲解,现有数组和json对象如下

var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];
var demoObj = {
 aaa: 'Javascript',
 bbb: 'Gulp',
 ccc: 'CSS3',
 ddd: 'Grunt',
 eee: 'jQuery',
 fff: 'angular'
};

for

可以直接看示例,用得太多了,很简单

(function() {
 for(var i=0, len=demoArr.length; i<len; i++) {
 if (i == 2) {
 // return; // 函数执行被终止
 // break; // 循环被终止
 continue; // 循环被跳过
 };
 console.log('demo1Arr['+ i +']:' + demo1Arr[i]);
 }
})();
关于for循环,有一下几

关于for循环,有以下几点需要注意

  • for循环中的i在循环结束之后任然存在与作用域中,为了避免影响作用域中的其他变量,使用函数自执行的方式将其隔离起来()();
  • 避免使用for(var i=0; i<demo1Arr.length; i++){} 的方式,这样的数组长度每次都被计算,效率低于上面的方式。也可以将变量声明放在for的前面来执行,提高阅读性
var i = 0, len = demo1Arr.length;
for(; i<len; i++) {};
  • 跳出循环的方式有如下几种

return 函数执行被终止
break 循环被终止
continue 循环被跳过
完整实例

for in

for(var item in arr|obj){} 可以用于遍历数组和对象

  • 遍历数组时,item表示索引值, arr表示当前索引值对应的元素 arr[item]
  • 遍历对象时,item表示key值,arr表示key值对应的value值 obj[item]
(function() {
 for(var i in demoArr) {
 if (i == 2) {
 return; // 函数执行被终止
 // break; // 循环被终止
 // continue; // 循环被跳过
 };
 console.log('demoArr['+ i +']:' + demoArr[i]);
 }
 console.log('-------------');
})();

关于for in,有以下几点需要注意:

  • 在for循环与for in循环中,i值都会在循环结束之后保留下来。因此使用函数自执行的方式避免。
  • 使用return,break,continue跳出循环都与for循环一致,不过关于return需要注意,在函数体中,return表示函数执行终止,就算是循环外面的代码,也不再继续往下执行。而break仅仅只是终止循环,后面的代码会继续执行。
function res() {
 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];

 for(var item in demoArr) {
 if (item == 2) {
 return;
 };
 console.log(item, demoArr[item]);
 }
 console.log('desc', 'function res'); //不会执行
}

forEach

demoArr.forEach(function(arg) {})
参数arg表示数组每一项的元素,实例如下

demoArr.forEach(function(e) {
 if (e == 'CSS3') {
 return; // 循环被跳过
 // break; // 报错
 // continue;// 报错
 };
 console.log(e);
})

具体有以下需要注意的地方

forEach无法遍历对象
forEach无法在IE中使用,firefox和chrome实现了该方法
forEach无法使用break,continue跳出循环,使用return时,效果和在for循环中使用continue一致
do/while

函数具体的实现方式如下,不过有一点值得注意的是,当使用continue时,如果你将i++放在了后面,那么i++的值将一直不会改变,最后陷入死循环。因此使用do/while一定要小心谨慎一点。

不建议使用do/while的方式来遍历数组
// 直接使用while

(function() {
 var i = 0,
 len = demoArr.length;
 while(i < len) {
 if (i == 2) {
 // return; // 函数执行被终止
 // break; // 循环被终止
 // continue; // 循环将被跳过,因为后边的代码无法执行,i的值没有改变,因此循环会一直卡在这里,慎用!!
 };
 console.log('demoArr['+ i +']:' + demoArr[i]);
 i ++;
 }
 console.log('------------------------');
})();

// do while
(function() {
 var i = 0,
 len = demo3Arr.length;
 do {
 if (i == 2) {
 break; // 循环被终止
 };
 console.log('demo2Arr['+ i +']:' + demo3Arr[i]);
 i++;
 } while(i<len);
})();

$.each

$.each(demoArr|demoObj, function(e, ele))
可以用来遍历数组和对象,其中e表示索引值或者key值,ele表示value值

$.each(demoArr, function(e, ele) {
 console.log(e, ele);
})

输出为

0 "Javascript"
1 "Gulp"
2 "CSS3"
3 "Grunt"
4 "jQuery"
5 "angular"
这里有很多需要注意的地方

  • 使用return 或者return true为跳过一次循环,继续执行后面的循环
  • 使用return false为终止循环的执行,但是并不终止函数执行
  • 无法使用break与continue来跳过循环
  • 循环中this值输出类似如下
console.log(this);
//String {0: "C", 1: "S", 2: "S", 3: "3", length: 4, [[PrimitiveValue]]: "CSS3"}

console.log(this == ele);
// true

关于上面的this值,遍历一下

$.each(this, function(e, ele) {
 console.log(e, ele);
})

// 0 c
// 1 s
// 2 s
// 4 3

为什么length 和 [[PrimitiveValue]]没有遍历出来?突然灵光一动,在《javascript高级编程》中找到了答案,大概意思就是javascript的内部属性中,将对象数据属性中的Enumerable设置为了false

// 查看length的内部属性
console.log(Object.getOwnPropertyDescriptor(this, 'length'));
// Object {value: 4, writable: false, enumerable: false, configurable: false}

$.each 中的 $(this) 与this有所不同,不过遍历结果却是一样,你可以在测试代码中打印出来看看
$(selecter).each

专门用来遍历DOMList

$('.list li').each(function(i, ele) {
 console.log(i, ele);
 // console.log(this == ele); // true
 $(this).html(i);
 if ($(this).attr('data-item') == 'do') {
 $(this).html('data-item: do');
 };
})
  • i: 序列值 ele: 只当前被遍历的DOM元素
  • this 当前被遍历的DOM元素,不能调用jQuery方法
  • $(this) == $(ele) 当前被遍历元素的jquery对象,可以调用jquery的方法进行dom操作

使用for in 遍历DOMList

因为domList并非数组,而是一个对象,只是因为其key值为0,1,2... 而感觉与数组类似,但是直接遍历的结果如下

var domList = document.getElementsByClassName('its');
for(var item in domList) {
 console.log(item, ':' + domList[item]);
}
// 0: <li></li>
// 1: <li></li>
// ...
// length: 5
// item: function item() {}
// namedItem: function namedItem() {}

因此我们在使用for in 遍历domList时,需要将domList转换为数组

var res = [].slice.call(domList);
for(var item in res) {}

类似这样的对象还有函数的属性arguments对象,当然字符串也是可以遍历的,但是因为字符串其他属性的enumerable被设置成了false,因此遍历出来的结果跟数组是一样的,也就不用担心这个问题了.
小补充

如果你发现有些人写函数这样搞,不要惊慌,也不要觉得他高大上。

+function(ROOT, Struct, undefined) {
 ... 
}(window, function() {
 function Person() {}
})

()(), !function() {}() +function() {}() 三种函数自执行的方式。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript 弹出窗口中是否显示地址栏的实现代码
Apr 14 Javascript
使用 Node.js 做 Function Test实现方法
Oct 25 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 Javascript
谈谈javascript中使用连等赋值操作带来的问题
Nov 26 Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
layui实现数据表格隐藏列的示例
Oct 25 Javascript
jquery ajax 请求小技巧实例分析
Nov 11 jQuery
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 Javascript
vue项目支付功能代码详解
Feb 18 Vue.js
js window对象属性和方法相关资料整理
Nov 11 #Javascript
js clearInterval()方法的定义和用法
Nov 11 #Javascript
jquery原理以及学习技巧介绍
Nov 11 #Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
Nov 11 #Javascript
轻松实现javascript数据双向绑定
Nov 11 #Javascript
谈谈对offsetleft兼容性的理解
Nov 11 #Javascript
详解 javascript中offsetleft属性的用法
Nov 11 #Javascript
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
PHP完整的日历类(CLASS)
2006/11/27 PHP
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python操作mysql数据库
2017/03/05 Python
Python之str操作方法(详解)
2017/06/19 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
Python logging设置和logger解析
2019/08/28 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
python实现查找所有程序的安装信息
2020/02/18 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
Django用户身份验证完成示例代码
2020/04/03 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
保送生自荐信范文
2013/10/06 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
污染环境建议书
2015/09/14 职场文书
react国际化react-intl的使用
2021/05/06 Javascript