为了方便例子讲解,现有数组和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循环中的i在循环结束之后任然存在与作用域中,为了避免影响作用域中的其他变量,使用函数自执行的方式将其隔离起来()();

  • 避免使用for(var i=0; i<demo1Arr.length; i++){}的方式,这样的数组长度每次都被计算,效率低于上面的方式。也可以将变量声明放在for的前面来执行,提高阅读性

var i = 0, len = demo1Arr.length;

for(; i<len; i++) {};

  • 跳出循环的方式有如下几种

    • return 函数执行被终止

    • break 循环被终止

    • continue 循环被跳过

完整实例
https://github.com/yangbo5207/front-end-road/blob/master/16.%E5%90%84%E7%A7%8D%E9%81%8D%E5%8E%86%E8%AF%A6%E8%A7%A3/demo1.html

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一致

  • 最重要的一点,可以添加第二参数,为一个数组,而且回调函数中的this会指向这个数组。而如果没有第二参数,则this会指向window。

  • var newArr = [];

  • demoArr.forEach(function(val, index) {

  • this.push(val); // 这里的this指向newArr

  • }, newArr)

虽然在原生中forEach循环的局限性很多,但是了解他的必要性在于,很多第三方库会扩展他的方法,使其能够应用在很多地方,比如angular的工具方法中,也有forEach方法,其使用与原生的基本没有差别,只是没有了局限性,可以在IE下使用,也可以遍历对象

var result = [];

angular.forEach(demoArr, function(val, index) {

this.push(val);

}, result);

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() {}() 三种函数自执行的方式^_^

来自:SegmentFault

链接:https://segmentfault.com/a/1190000003968126

JavaScript遍历方式详解的更多相关文章

  1. JavaScript 各种遍历方式详解及总结

    JavaScript 各种遍历方式详解 在$.each中想要终止循环,但是它没有continue或者break这样的终止方式,所以尝试使用return来进行终止,但是发现并没有跳出循环.为了搞清楚js ...

  2. JavaScript 各种遍历方式详解,有你不知道的黑科技

    http://segmentfault.com/a/1190000003968126 为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp ...

  3. JavaScript 各种遍历方式详解

    为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; v ...

  4. JavaScript各种遍历方式详解

    为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; v ...

  5. JavaScript继承方式详解

    原文链接 : http://segmentfault.com/a/1190000002440502 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继 ...

  6. JavaScript继承方式详解[转]

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...

  7. JavaScript 继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承)类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继 ...

  8. JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

    原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...

  9. 从mixin到new和prototype:Javascript原型机制详解

    从mixin到new和prototype:Javascript原型机制详解   这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...

随机推荐

  1. Biba模型简介

    上周上信息安全的课,老师留了个Biba模型的作业.自己看书了解了一下,记录如下. 参考资料:石文昌<信息系统安全概论第2版> ISBN:978-7-121-22143-9 Biba模型是毕 ...

  2. Ubuntu 取消sudo密码

    需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...

  3. 【Linux高频命令专题(17)】head

    概述 head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 命令格式 hea ...

  4. Android handler.obtainMessage()

    在handler.obtainMessage()的参数是这样写的: Message android.os.Handler.obtainMessage(int what, int arg1, int a ...

  5. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

    在部署的时候出现Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server ...

  6. 购买使用Linode VPS必须知晓的十个问题

    Linode是国外非常著名的VPS商之一,目前在国内站长圈中备受推崇.有许多站长已经购买了Linode VPS,但是部分站长由于中英语言不通,对Linode的政策不了解,从而造成了许多不必要的损失.本 ...

  7. hdu 4973 A simple simulation problem. (线段树)

    题目链接 题意: 给定n长的序列 m个操作 序列默认为 1, 2, 3···n 操作1:D [l,r] 把[l,r]区间增长 :( 1,2,3,4 进行 D [1,3]变成 1,1,2,2,3,3,4 ...

  8. volicity语法学习和总结

    Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象.当Velocit ...

  9. 对于oracle监听器的配置

    oracle 的 net configuration  assist中配置完第一项的监听程序配置(对应文件listener.ora)之后,还要重新配置下第三项本地网络服务名配置(对应文件tnsname ...

  10. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...