JavaScript中利用各种循环进行遍历的方式总结


Posted in Javascript onNovember 10, 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 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 相关文章推荐
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
两种常用的javascript数组去重方法思路及代码
Mar 26 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
Jquery自定义button按钮的几种方法
Jun 11 Javascript
javascript代码调试之console.log 用法图文详解
Sep 30 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 Javascript
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
解决vue axios的封装 请求状态的错误提示问题
Sep 25 Javascript
Vue3新特性之在Composition API中使用CSS Modules
Jul 13 Javascript
k8s node节点重新加入master集群的实现
Feb 22 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 #Javascript
js密码强度校验
Nov 10 #Javascript
详解javascript函数的参数
Nov 10 #Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 #Javascript
javascript实现五星评分功能
Nov 10 #Javascript
javascript实现密码验证
Nov 10 #Javascript
JavaScript编程的单例设计模讲解
Nov 10 #Javascript
You might like
用session做客户验证时的注意事项
2006/10/09 PHP
PHP session有效期问题
2009/04/26 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
Python字符串替换实例分析
2015/05/11 Python
Python实现控制台进度条功能
2016/01/04 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
浅述python中深浅拷贝原理
2018/09/18 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
Python 日期与时间转换的方法
2020/08/01 Python
PHP开发工程师面试问题集锦
2012/11/01 面试题
什么是Remote Module
2016/06/10 面试题
《小松树和大松树》教学反思
2014/02/20 职场文书
论文评语大全
2014/04/29 职场文书
城南旧事电影观后感
2015/06/16 职场文书
行政处罚决定书
2015/06/24 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
导游词之吉林吉塔
2019/11/11 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技