`
271788203
  • 浏览: 490214 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

js中遍历数组的效率问题

阅读更多
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>jquery</title>
    <style type="text/css">
    #info {
        color:#FF0000;
        height:150px;
    }
    </style>
</head>
<body>
    <div id="div1">
    <input value="5000" type="text" id="txt1"/><input type="button" id="btn1" value="生成 checkbox"/>
    <div id="info">
    <input type="button" id="btnTest1" onclick="fun1(this)" value="第一种"/><span></span><br/>
    <input type="button" id="btnTest1" onclick="fun2(this)" value="第二种"/><span></span><br/>
    <input type="button" id="btnTest1" onclick="fun3(this)" value="第三种"/><span></span><br/>
    </div>
    <div id="box"></div>
    </div>
</body>
<script type="text/javascript">
var g=function(id) {return document.getElementById(id);};
g("btn1").onclick=function() {
    var val=g("txt1").value-0;
    if(!isNaN(val)) {
        var box=g("box");
        box.innerHTML="";
        for(var i=0;i<val;i++) {
            var chk=document.createElement("input");
            chk.type="checkbox";
            box.appendChild(chk);
        }
    }
   
}
//这里为了简单就没有判断type
var fun1=function(obj) {//第一种直接在for中取数组长度
    var chks=g("box").getElementsByTagName("input");
    var b=!chks[0].checked;

    var d=new Date();
    for(var i=0;i<chks.length;i++) {
        //chks[i].checked=b;
    }
    obj.nextSibling.innerHTML=new Date()-d;
}
var fun2=function(obj) {//第二种
    var chks=g("box").getElementsByTagName("input");
    var b=!chks[0].checked;

    var d=new Date();
    for(var i=0;chks[i];i++) {
        //chks[i].checked=b;
    }
    obj.nextSibling.innerHTML=new Date()-d;
}
var fun3=function(obj) {//第三种将数组的长度放到一个局部变量中
    var chks=g("box").getElementsByTagName("input");
    var b=!chks[0].checked;
    var length=chks.length;
    var d=new Date();
    
    for(var i=0;i<length;i++) {
        //chks[i].checked=b;
    }
    obj.nextSibling.innerHTML=new Date()-d;
}
</script>
</html>

 

第一种:每次循环读取 chks 集合的属性 length;
第二种:每次循环定位 chks[i];
第三种:每次循环读取 变量 length。

-----------------------------------------------

第一种:406 ms
第二种:16 ms
第三种:0 ms

--------------------------------

第三种直接读取变量速度最快,第二种集合定位次之,第一种最慢,
每种之间相差一个数量级。

----------------------------------------------------

第一种之所以慢是因为访问集合的 length 属性时需要遍历 prototype,从而获取 length,
这就增加了不必要的开销,因为 length 只是终止条件,并未参与实际运算。

----------------------------------------------------

另,如果循环中需要多次访问 chks[i] 的话,就应该进一步优化,从而降低内部检索的开销。

可以充分利用 js 的特性,不必读取 length,并将定位与赋值分离,优化代码如下 :

var fun3=function(obj) {
    var chks=g("box").getElementsByTagName("input");
    var b=!chks[0].checked;

    var d=new Date();
    for(var i=0,chk; chk=chks[i]; i++) {
        chk.checked=b;
    }
    obj.nextSibling.innerHTML=new Date()-d;
}

 

 

分享到:
评论

相关推荐

    Vue中遍历数组的新方法实例详解

    以下将详细讲解在 Vue 中遍历数组的一些新方法及其应用实例。 1. `forEach` 循环: `forEach` 是 ES5 引入的一种遍历数组的方法,它会为数组中的每个元素执行一次提供的函数。然而,`forEach` 不支持使用 `return`...

    js,java提高编程效率之【for循环优化】.pdf

    这段代码适用于遍历数组中的所有元素。然而,当数组非常大时,每次循环都要检查`arrays.length`,这将造成不必要的计算开销。特别是在循环数百万次的情况下,这种重复计算会显著降低程序性能。 针对这个问题,可以...

    深入探究JavaScript中for循环的效率问题及相关优化

    JavaScript是目前前端开发中最为广泛使用的脚本语言,它提供了多种循环语句来遍历数组和对象,其中for循环是最基础也是最常用的一种。然而,传统的for循环在处理复杂逻辑或大数据集合时可能会影响脚本的执行效率,...

    javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号.docx

    为了解决这个问题,我们可以使用两种方法:一种是生成整个全排列的数组,然后遍历数组得到对应的序号;另一种是从小到大生成 push 数组,然后判断该数是否是当前题目给的数,如果是的话,要求的序号就是当前数组的...

    自定义的js contains方法

    这个方法首先假设数组的第一个元素是最大的,然后遍历数组的其余部分来验证或更新这个假设。最终返回的最大值是整个数组中的最大元素。虽然这种方法有效,但在现代JavaScript中,使用`Math.max`结合`apply`或`reduce...

    几个常用javascript函数

    与`forEach()`类似,`map()`也遍历数组,但它创建一个新的数组,新数组的元素是原始数组元素经过回调函数处理后的结果。例如: ```javascript const numbers = [1, 2, 3, 4, 5]; const squaredNumbers = numbers...

    12.JS动态添加员工作业.zip

    5. **数组方法**:如果员工数据存储在一个数组中,可以利用数组的方法如`map()`、`forEach()`等遍历数组,生成对应的HTML元素。 6. **DOM碎片**:当大量添加元素时,一次性操作可能会导致性能问题。可以使用`...

    JavaScript数组特性与实践应用深入详解

    遍历数组时,虽然可以使用for...in循环,但这种方式可能会遍历到原型链上的属性,因此推荐使用for循环或forEach方法。在使用for循环时,循环的起始条件是0,终止条件是数组的length属性值,每次循环都检查当前索引...

    JavaScript学习笔记之取数组中最大值和最小值_.docx

    - **思路**:将数组的第一个元素设为当前最大值/最小值,然后遍历数组中的每个元素,与当前最大值/最小值进行比较。 - **优点**:易于理解和实现。 - **缺点**:当数组很大时,性能可能会受到影响。 ##### 2. **...

    javascript 5 范例

    - 使用 `for` 循环或 `for...in` 循环可以遍历数组和对象,但 `for...in` 主要用于遍历对象的属性。 - `Array.prototype.forEach()` 方法提供了一种更简洁的遍历数组的方式。 8. **异步编程(Asynchronous ...

    测试js数组的一点特性写的代码

    遍历数组常用的方法有`for`循环、`forEach()`、`map()`、`reduce()`等。 **for循环:** ```javascript for (let i = 0; i ; i++) { console.log(array[i]); } ``` **forEach():** ```javascript array.forEach(...

    06-两数之和.md

    常规解法是使用两层循环遍历数组,对于每一个元素,再次遍历数组寻找是否存在一个与之相加等于`n`的另一个元素。这种方法的时间复杂度是`O(n^2)`,在数据量大时效率极低,不适用于实际工作中的性能要求。 更优的...

    js代码-tmp--数组中的逆序对-改

    线性扫描法通过遍历数组两次来计算逆序对,第一次遍历排序数组,第二次遍历数组记录逆序对。这种方法时间复杂度为O(n^2),不适合大规模数据。 归并排序法利用了分治策略,将数组分成两半,分别计算两个子数组的逆序...

    js 数组实现一个类似ruby的迭代器

    例如,可以扩展Array原型,添加一个名为each的方法,使用这个方法可以遍历数组中的每个元素,并对每个元素执行给定的函数。这种方式比使用for循环来遍历数组更为简洁,易于阅读和维护。 2. 在迭代中引用原来的对象...

    JavaScript闭包函数访问外部变量的方法

    第一个例子是通过数组存储闭包,然后遍历数组执行闭包,观察闭包对变量的引用情况。第二个例子是通过绑定事件处理器的方式,来观察在循环中创建的闭包是如何引用变量的。在这两个例子中,我们都可以发现一个共同的...

    JS数组求和的常用方法总结【5种方法】

    `Array.prototype.forEach()`方法遍历数组中的每个元素,执行提供的函数。这里我们可以用它来累加元素。 ```javascript function sum(arr) { var s = 0; arr.forEach(function(val, idx, arr) { s += val; }...

    JS判断数组中是否有重复值得三种实用方法

    通过排序数组,再遍历数组判断相邻元素是否相同,可以有效地检测出重复的元素。具体步骤如下: 1. 创建一个数组,并使用 sort() 方法对其进行排序。 2. 遍历排序后的数组,检查相邻的两个元素是否相同。 3. 如果发现...

    js代码-二维数组中的查找

    线性查找(Linear Search)是最基础的查找方法,它遍历数组的每一个元素,直到找到目标值或者遍历完整个数组。对于二维数组,线性查找的复杂度会稍高,因为它需要遍历两层:外层遍历行,内层遍历列。 ```javascript...

    Web前端开发工程师笔试题及答案

    优化后的代码直接创建数组`info`,并将各子字符串作为数组元素,然后遍历数组弹出警告框,提高了执行效率。 3. 异步加载 JavaScript: - `defer`属性:在HTML中,`&lt;script&gt;`标签的`defer`属性用于延迟脚本执行,...

Global site tag (gtag.js) - Google Analytics