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仅仅只是终止循环,后面的代码会继续执行。
- while - 当指定的条件为 true 时循环指定的代码块
- 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下都不兼容