在使用js去做循环遍历的过程中我们会遇到许多遍历的方法,那么这些方法都有什么区别,应用于什么场景呢?作为一个js的初学者, 做了以下总结,若有总结不对的地方,还请各位猿友们热心帮忙批评指正啦!
for…in…用来遍历数组,但是实际上是遍历数组的属性名。为什么会这么说呢,以下两个例子就会让你很清楚:
const a = ['a','b','c']; for(const i in a){ console.log(i); // 输出 0, 1, 2 } a.age = 22; for(const i in a){ console.log(i); // 输出 0, 1, 2, age }为什么会这样呢,是因为首先Array也是一个对象,只是省略了属性名的对象,而在a中,0,1,2就是‘A’,‘B’,'C’默认的属性名,age则是22的属性名,所以for…in…遍历的结果只是将属性名输出。(但是length这个属性名不包含在内哦!)
for…of…就比较厉害了,完美的解决了for…in…留下的问题,并且还增加了许多新功能(不仅可以遍历数组,还可以遍历Set/Map),它只遍历集合本身的元素。同样看以下代码:
const a = ['a','b','c']; for(const i of a){ console.log(i); // 输出 a, b, c } a.age = 22; for(const i of a){ console.log(i); // 输出 a, b, c, 22 } //遍历Set const set = new Set(['a','b','c']); for(const i of set){ console.log(i); // 输出 a, b, c } //遍历Map const map = new Map([[1,'a'],[2,'b'],[3,'c']]); for(const i of map){ console.log(i); // 输出 [1, "a"], [2, "b"], [3, "c"] console.log(i[0]);// 输出 1,2,3 console.log(i[1]);// 输出 a,b,c }forEach(callback) 方法对数组的每个元素执行一次提供的callback函数.
var array = ['a', 'b', 'c']; array.forEach(function(element) { console.log(element); //输出 a,b,c });但是!!!没有办法中止或者跳出 forEach() 循环,除了抛出一个异常。如果你需要这样,使用 forEach() 方法是错误的。并且,forEach会改变原数组,看下面例子:
var words = ['one', 'two', 'three', 'four']; words.forEach(function(word) { if (word === 'two') { words.shift(); } }); console.log(words) //输出 Array ["two", "three", "four"]另外,补充一个新知识点,今天我想用forEach 遍历一个Object, 那肯定是不行的不,所以我们可以用Object.keys(object)先将keys提取出来就可以啦!(Object.keys(object).forEach())
而与forEach拥有同样功能的map又有什么区别呢? 重要的区别是forEach没有返回值,而map可以将结果返回出来。看如下代码:
const arr = [1, 2, 3, 4, 5]; arr.forEach((num, index) => { return arr[index] = num * 2; }); // 执行结果如下:arr = [2, 4, 6, 8, 10] map doubled = arr.map(num => { return num * 2; }); //执行结果如下:doubled = [2, 4, 6, 8, 10]并且据相关人员测试,map的效率是会比forEach高的哦!如果你习惯使用函数是编程,那么肯定喜欢使用map()。因为forEach()会改变原始的数组的值,而map()会返回一个全新的数组,原本的数组不受到影响。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。 另外,map/forEach里面的函数都是串行执行的哈,官网上有写,所以要是想实现并行执行呢,可以考虑用async.each之类的方法,好啦,先暂时总结到这里,希望能够帮助到跟我一起敲代码的初学者啦!
最后该文章参考了如下资源:
https://blog.csdn.net/qq_27034333/article/details/86213650https://www.jb51.net/article/134411.htmhttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach