JavaScript各种遍历方法的使用与效率介绍

来源:互联网 发布:单片机串口啥意思 编辑:程序博客网 时间:2024/05/16 04:46

javaScript语言中有很多不足,在他衍生的过程中,他也不断在做着优化,下面介绍一下JavaScript中的各种遍历方式以及他们的效率。
遍历我们最熟悉的就是for循环了。

for(let j = 0; j < arr.length; j++) {} 

这里指出一点,ES6推出了let来声明变量,两者的区别如下:

var a = [];for(var/let i=0;i<10;i++){    a[i] = function(){        console.log(i);    }}a[6]();  //let 6  var 10

let 定义的i是只有在当前轮的循环有效,所以每一次i都是一个新的变量。不要问为什么当前有效还能记得上一轮循环的值,
这都是托JavaScript引擎的福。当然了使用let比var还有更多的好处,这里就不介绍了。想了解的可以参照阮大神的ES6入门。
回到for循环,效率无功无过,可以满足正常使用。
这里插一嘴,如果给一个数组遍历,不要把长度的计算公式写在i<10的位置,这样会减少一些计算量。
比如

for(let i=0,let len=array.length;i<len;i++){}

定义一个临时变量来存储长度。
下面我们说一说forEach循环
他是ES3中提出来的,实际上他的性能要比普通的for循环弱。由于传递的参数过多,本身数据结构也比较复杂。

[1,2,3].forEach(function(item,index,arr){console.log(arr[index])});

再说一说for in 循环
他在JavaScript 1.0中就提出来了。
在这里 顺便把for of 搬出来让他俩做一下比较,这样更加直观。这里指出,想使用for of循环,必须具备iterator接口,
原生具备接口的数据结构:Array,Map,Set,String,TypedArray,函数的arguments对象,NodeList对象。
如果没有的,要在Symbol.iterator属性上部署遍历器的生成方法(原生的足够我们消费,初期不用太关心)。

let arr = [3, 5, 7];arr.foo = 'hello';for (let i in arr) {console.log(i); // "0", "1", "2", "foo"}for (let i of arr) {console.log(i); // "3", "5", "7"}

由上述代码可知,for…in 只能获取对象的键名,无法直接获取键值。for…of读取键值。
可以借助,数组实例的entries和keys方法进行更多的操作例子如下

for (let index of ['a', 'b'].keys()) {  console.log(index);}// 0// 1for (let elem of ['a', 'b'].values()) {  console.log(elem);}// 'a'// 'b'for (let [index, elem] of ['a', 'b'].entries()) {  console.log(index, elem);}// 0 "a"// 1 "b"

回到效率,其实for in在众多的循环中效率是最弱的,for of效率优于for in循环,但是效率仍然不及for循环。
还有一种遍历的方式就是map了

arr.map((n)=>{    console.log(n);})

总的来说,使用优雅,但是效率不及forEach.

总结:无论循环次数如何,for循环效率最高,当执行次数较小,for each存在优势,但循环次数变大之后,变得很糟糕。
for of表现的比较稳健,循环次数大小不会有太大波动。(以上效率均为普通循环,无复杂操作)

阅读全文
1 0
原创粉丝点击