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 相关文章推荐
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
Feb 11 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
Router解决跨模块下的页面跳转示例
Jan 11 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
js+canvas实现纸牌游戏
Mar 16 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
node 版本切换的实现
2020/02/02 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
python 中字典嵌套列表的方法
2018/07/03 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
应聘自荐信
2013/12/14 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书