[转] 怎样快速而优雅地遍历 JavaScript 数组
我们一般用循环来遍历数组,而循环一直是 JavaScript 性能问题的常见来源,有时循环用得不好会严重降低代码的运行速度。例如,遍历数组时,我们会很自然地写出下面这种代码:
// 未优化的代码1
var array = [0,1,2,3,4,5,6,7,8,9];// for-in 循环
for (var val in array) {
fn(val); -> should be fn(array[val])
}
还有这一种常见写法:
// 未优化的代码2
var array = [0,1,2,3,4,5,6,7,8,9];// for 循环
for (var i=0; i < array.length; i++) {
fn(array[i]);
}
这两个方法看上去似乎不错,而且语义上也很容易理解。但是这两个方法都有性能问题:
“未优化的代码1”中,for-in 需要分析出 array 的每个属性,这个操作的性能开销很大,用在 key
已知的数组上是非常不划算的。所以尽量不要用 for-in,除非你不清楚要处理哪些属性,例如 JSON 对象这样的情况。
“未优化的代码2”中,循环每执行一次,都要检查一次 array.length 的值,读属性要比读局部变量慢,尤其是当 array
里存放的都是 DOM 元素(像 array =
document.getElementByClassName("class");),因为每次读 array.length
都要扫描一遍页面上 class="class" 的元素,速度更是慢得抓狂。
假如你的任务是从页面上 100 个复选框中,找出选中的复选框的 value,并把它们放入一个数组的话,在 IE
上可能得花上半秒才能完成。结果就是,用户在列表里选择了自己要的项目,点击提交后起码要过半秒才会有反应,直观感觉就是很卡。
我们绝不能接受这样的结果,所以我们需要加快循环终止条件的计算速度。先把数组的长度先查出来,存进一个局部变量,那么循环的速度将会大大提高:
// 快速的代码
var array = [0,1,2,3,4,5,6,7,8,9];// for 循环
var length = array.length;
for (var i=0; i <
length; i++) {
fn(array[i]);
}
现在只需要读取一次 array.length 的值,遍历数组的过程大大加快了。
不过我们还可以让它更快。如果循环终止条件不需要进行比较运算,那么循环的速度还可以更快:
// 最快的代码
var array = [0,1,2,3,4,5,6,7,8,9];// for 循环
for (var i = array.length; i--;)
{
fn(array[i]);
}
把数组下标改成向 0 递减,循环终止条件只需要判断 i 是否为 0
就行了。因为循环增量和循环终止条件结合在一起,所以可以写成更简单的 while 循环:
// 最快且优雅的代码
var array = [0,1,2,3,4,5,6,7,8,9];// while 循环
var i = array.length;
while (i--) {
fn(array[i]);
}
[转] 怎样快速而优雅地遍历 JavaScript 数组的更多相关文章
- 遍历Javascript数组的一种方法!
应用场景: 如果您的数组只用一次的话就适用这种方法,因为遍历完后数组便清空了.代码如下: var arr=[1,5,6,2,3]; for(;i=arr.shift();){ console.log( ...
- JavaScript快速入门(四)——JavaScript函数
函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...
- 如何利用JavaScript遍历JSON数组
1.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- JavaScript 数组遍历方法的对比
JavaScript 发展至今已经发展出多种数组的循环遍历的方法,不同的遍历方法运行起来那个比较快,不同循环方法使用在那些场景,下面将进行比较: 各种数组遍历的方法 for 语句 ,,,] , len ...
- JavaScript数组循环遍历之forEach
1. js 数组循环遍历. 数组循环变量,最先想到的就是 for(var i=0;i<count;i++)这样的方式了. 除此之外,也可以使用较简便的forEach 方式 2. forEac ...
- javascript数组常用的遍历方法
本篇文章给大家带来的内容是关于javascript数组常用的遍历方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 本文主要介绍数组常见遍历方法:forEach.m ...
- JavaScript 中的常用12种循环遍历(数组或对象)的方法
1.for 循环 let arr = [1,2,3]; for (let i=0; i<arr.length; i++){ console.log(i,arr[i]) } // 0 1 // 1 ...
- JavaScript数组遍历map()的原型扩展
在 JavaScript 1.6 里,javascript 数组增加了几个非常有用的方法:indexOf.lastIndexOf.every. filter. forEach. map. some,其 ...
- Javascript数组方法(译)
在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法.数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回'object'. ...
随机推荐
- absolut绝对定位的非绝对定位用法
一.absolute绝对定位的流行用法 一般而言,我们会用absolute绝对定位做什么呢?就是绝对定位,顾名思意,定死在某个位置上.例如,lightbox效果就是使用的绝对定位,例如新浪微博的弹出提 ...
- VC++ 列表控件的使用方法
列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值.MFC中使用CListCtrl类来封装列表控件的各种操作. 通过调用BOOL Create( DWORD ...
- urlconnection.connect()和url.openconnection()的区别
urlconnect()ion.connect()()方法是抽象的:打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接). 如果在已打开连接(此时 connect()ed 字段的值为 tr ...
- 在iOS7中修改状态栏字体的颜色-b
状态栏的字体为黑色: UIStatusBarStyleDefault 状态栏的字体为白色: UIStatusBarStyleLightContent 一.在 info.plist 中,将 View ...
- Word Pattern
package cn.edu.xidian.sselab.hashtable; import java.util.HashMap;import java.util.Map; /** * * @au ...
- struts2令牌,防止重复提交
struts2的令牌,可以用来防止重复提交,其原理是在提交jsp页面中,写入一个隐藏域name="token",然后在action中定义一个变量token并get.set.在服务器 ...
- Expanding Rods(二分)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10287 Accepted: 2615 Description When ...
- (转载)mysql中百万级数据插入速度测试
(转载)http://www.111cn.net/database/mysql/42453.htm 100W的数据对于很多朋友来说算小菜了,但今天我就想到创建一个大量数据的测试环境,于是找了一下怎么插 ...
- 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci ...
- 检测CPU是否支持虚拟化
一:下载检测软件 地址:http://files.cnblogs.com/hongmaju/Coreinfo.rar 二:使用方法 打开运行窗口,找到Coreinfo.exe,运行如下: 现在你要做的 ...