JS中的常用循环遍历方法|数组的常用方法
概念区分
- 循环(Loop):控制编程语句进入循环并重复执行同一段编程命令。如:while循环。
- 迭代(Iteration):指按照某种顺序逐个访问列表中的每一项(控制结构:重复结构)。核心是接近目标,新值覆盖旧值,空间利用率高。是一种特殊的遍历。如:for语句。
- 遍历(Traversal):按照一定的规则访问树形结构中的每个节点,每个节点只访问一次。如:vue中watch对data的深度监听。
- 递归(Recursion):程序调用自身(控制结构:选择结构)。核心是缩小范围,每调用一次就开辟一块栈空间,占用空间大。
方法
1 for
常用于遍历(迭代)数组、字符串。
可以控制循环起点或终点,其他方法只能从头开始。
1 | let arr=[7,8,4,2]; |
ES6之后使用let声明i,可以避免变量溢出。
2 for of (ES6)
常用于遍历(迭代)数组、字符串,以及带有iterator接口的对象,如:Array,Set,Map,String,TypedArray,arguments。
for of不能遍历对象。
1 | let arr=['a','b','c']; |
也可以用let声明i,区别只在于能否修改这个变量。
可以使用break,continue,return。
3 for in
常用于遍历(迭代)对象,遍历除Symbol以外的可枚举属性。
1 | let obj={ name:'Luffy',title:'One Piece' }; |
如果用for in来遍历数组,输出的是数组的索引(下标)、对象的属性和原型链上的属性,一般不这样用。
1 | let arr=[6,0,3]; |
4 forEach
常用于数组、Map、Set,接收三个参数,无法使用break,continue,return跳出或中断循环,只能使用rtry catch中的throw抛出异常来停止,返回undefined,不改变原数组。
forEach不能遍历对象。arr.forEach(function(value,index,arr){...},this);
三个参数只能按序添加,第一个参数必填,后面的参数和回调指向的this都可选。
所有的写法:
1 | forEach(function(element) { /* … */ }) |
1 | let arr=[5,6,4,5]; |
配合箭头函数使用:箭头函数没有this,没有arguments,不能new。
1 | let arr=[5,6,4,5]; |
5 map()
Array对象内置方法。不改变原数组,返回一个新数组。不对空数组检测。比forEach快。
1 | let arr=[3,8,2,5,6]; |
6 filter()
Array对象内置方法。不改变原数组,返回一个新数组,过滤符合条件的所有元素。不对空数组检测。
1 | let arr=[5,0,3,6,9]; |
7 some()
Array对象内置方法。检测数组元素中是否有元素符合指定条件。不改变原数组。不对空数组检测。
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。(不完全迭代)
如果没有满足条件的元素,则返回false。
1 | let arr=[1,4,5,2]; |
8 every()
Array对象内置方法。用于检测数组所有元素是否都符合指定条件。不改变原数组。不对空数组检测。
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。(不完全迭代)
如果所有元素都满足条件,则返回 true。
1 | let arr=[3,7,1]; |
9 reduce() / reduceRight()
Array对象内置方法。将数组元素计算为一个值(reduce:从左到右,reduceRight:从右到左)。不改变原数组。不对空数组检测。
1 | let arr=[4,0,6,8]; |
10 Array的其它内置方法
1 | let arr=[3,7,5,1]; |
其它遍历方法:while, do while(属于循环)
End.🐧