[转] 怎样快速而优雅地遍历 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'. ...
随机推荐
- Apache配置域名
Apache配置域名 在WIN下安装APACHE配置虚拟目录和UNIN下基本是一样的就是修改httpd.conf1:单个IP对应单个域名例如:www.phpunion.com对应192.168.1.1 ...
- truncate 命令删除恢复
truncate命令可以一次性删除当前表中所有记录并且不留任何日志,同时这个表的ID就自动初化从1开始,今天我就来给大家尝试一个利用truncate清除记录之后恢复过程. 实际线上的场景比较复杂,当时 ...
- YII 小部件 yii小部件查看方法 小物件做的表单
要使用小部件,可以先到总文件去找 framework/yiilite文件里面搜索“CAtiveForm” (如果觉得小部件的radio布局有点难看,可以在外面定义,具体可以在控制器里面定义) 如下 ...
- PHPCMS get当中使用limit
最近在用PHPCMS V9做一个站子,发现get标签非常好用,自定义模型后get几乎变成万能的了.但是PHPCMS升级到V9后,把2008的很多功能都去掉了,比如get标签中,在后面自动添加了一个LI ...
- 用python选择及显示三级目录,可返回上层目录以及随时跳出。
# -*- coding: utf-8 -*-"""Created on Fri Jul 29 09:43:38 2016 @author: yinggang" ...
- python【第三篇】函数
内容大纲: 1.函数基本语法与特性 2.参数与局部变量 3.返回值 4.递归 5.匿名函数lambda 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法与特性 函数的定义:函数是指将一 ...
- phread_con_wait和pthread_mutex_lock实现的生产者消费者模型
条件变量是利用线程间共享的全局变量进行同步的一种机制, 主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起: 另一个线程使"条件成立"(给出条件成立信号 ...
- 转:推荐!国外程序员整理的 C++ 资源大全
原文来自于:http://blog.jobbole.com/78901/ 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据 ...
- LA 3998 Prime k-tuple
题意:如果K个相邻素数p1,p2,p3.....pk满足pk-p1=s,称这些素数组成一个距离为s的素数K元组,输入a,b,k,s,输出区间[a,b]内距离为s的素数k元组的个数. 思路:先打到500 ...
- Qt中暂停线程的执行(利用QMutex,超级简单明了)
在线程中定义一个信号量: QMutex pause;把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock(); //循环执行的 ...