js 循环 遍历

JS支持不同类型的循环:

1. for - 循环代码块一定的次数

普通的for循环

for (语句 1; 语句 2; 语句 3)
{
// 被执行的代码块
}
语句 1 在循环(代码块)开始前执行
语句 2 定义运行循环(代码块)的条件
语句 3 在循环(代码块)已被执行之后执行
语句1/2/3都是可选的

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

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

for(j = 0; j < arr.length; j++) {
   
} 
for(j = 0,len=arr.length; j < len; j++) {
   
}
// 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。

  ***这种方法基本上是所有循环遍历方法中性能最高的一种***
2. for/in - 循环遍历对象的属性

循环遍历对象的属性 || 循环遍历数组的index

var person={fname:"John",lname:"Doe",age:25};

for (let key in person)
  {
  console.log(key )
  }
结果:
 fname
 lname
 age
var array=[1,2,3,4,5,6];
for(let index in array)
{
  console.log(index );
}
结果:
 0
 1
 2
 3
 4
 5

for(var item in arr|obj){ } 可以用于遍历数组和对象
遍历数组时,item表示索引值, arr表示当前索引值对应的元素 arr[item]
遍历对象时,item表示key值,arr表示key值对应的value值 obj[item]

关于for in,有以下几点需要注意:
在for循环与for in循环中,i值都会在循环结束之后保留下来。因此使用函数自执行的方式避免。
使用return,break,continue跳出循环都与for循环一致,不过关于return需要注意
在函数体中,return表示函数执行终止,就算是循环外面的代码,也不再继续往下执行。而break仅仅只是终止循环,后面的代码会继续执行。

  1. while - 当指定的条件为 true 时循环指定的代码块
  2. do/while - 同样当指定的条件为 true 时循环指定的代码块

while和do/while在循环时用得少,暂不详细说明

3. $.each和$().each

在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法。两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点。

$().each,对于这个方法,在dom处理上面用的较多。如果页面有多个input标签类型为checkbox,对于这时用$().each来处理多个checkbook,例如:

$(“input[name=’ch’]”).each(function(i){
if($(this).attr(‘checked’)==true)
{
//一些操作代码

}

回调函数是可以传递参数,i就为遍历的索引。

对于遍历一个数组,用$.each()来处理,例如:

$.each([{“name”:”limeng”,”email”:”xfjylimeng”},{“name”:”hehe”,”email”:”xfjylimeng”},function(i,n)
{
alert(“索引:”+i,”对应值为:”+n.name);
});

参数i为遍历索引值,n为当前的遍历对象.

其实jQuery里的each方法是通过js里的call方法来实现的。

4.for of - ES6

这是最简洁、最直接的遍历数组元素的语法
这个方法避开了for-in循环的所有缺陷
与forEach()不同的是,它可以正确响应break、continue和return语句
for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM [NodeList对象]
for-of循环也支持字符串遍历,它将字符串视为一系列的Unicode字符来进行遍历

for (var chr of "") {
  alert(chr);
}

for (var word of uniqueWords) {
   console.log(word);
}

for (var [key, value] of phoneBookMap) {
   console.log(key + "'s phone number is: " + value);
}

5. Array的方法foreach - ES5

forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文

forEach:用来遍历数组中的每一项;这个方法执行是没有返回值的,对原来数组也没有影响;
数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
每一次执行匿名函数的时候,还给其传递了三个参数值:数组中的当前项item,当前项的索引index,原始数组input;
理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是我们可以自己通过数组的索引来修改原来的数组;
forEach方法中的this是ary,匿名回调函数中的this默认是window;

var ary = [12,23,24,42,1];
var res = ary.forEach(function (item,index,input) {
     input[index] = item*10;
     console.log(this, 'this======');//--> Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …} "this======"
})
console.log(res);//-->undefined;

console.log(ary);//-->会对原来的数组产生改变;  [120, 230, 240, 420, 10]

参数
callback => 为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值) => 数组中正在处理的当前元素。
index(索引) => 数组中正在处理的当前元素的索引。
array => forEach()方法正在操作的数组。
thisArg => 可选 可选参数。当执行回调 函数时用作this的值(参考对象)。
返回值 => undefined

6. map

map:和forEach非常相似,都是用来遍历数组中的每一项;

区别:map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);
不管是forEach还是map 都支持第二个参数值,第二个参数的意思是把匿名回调函数中的this进行修改。

var ary = [12,23,24,42,1];
var res = ary.map(function (item,index,input) {
     return item*10;
})
console.log(res);//-->[120,230,240,420,10];
console.log(ary);//-->[12,23,24,42,1];

参数
callback => 为数组中每个元素执行的函数,该函数接收三个参数:

currentValue(当前值) =>  数组中正在处理的当前元素。
index(索引) => 数组中正在处理的当前元素的索引。
array =>  forEach()方法正在操作的数组。

thisArg => 可选 可选参数。当执行回调 函数时用作this的值(参考对象)。
返回值 => 一个新数组,每个元素都是回调函数的结果

不管是forEach还是map在IE6-8下都不兼容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、 map 返回一个新的数组,每个元素为调用func的结果, 不改变原数组let list = [1, 2, ...
    Rose_yang阅读 206评论 0 0
  • 为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp...
    抓住时间的尾巴吧阅读 983评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,268评论 0 4
  • 本文为原创文章,如需转载请注明出处,谢谢! 当我老了,我还是会看书,慢慢的读着,我不着急。 当我老了,我还是会爱花...
    momo521阅读 280评论 0 2