<!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 中遍历数组的一些新方法及其应用实例。 1. `forEach` 循环: `forEach` 是 ES5 引入的一种遍历数组的方法,它会为数组中的每个元素执行一次提供的函数。然而,`forEach` 不支持使用 `return`...
这段代码适用于遍历数组中的所有元素。然而,当数组非常大时,每次循环都要检查`arrays.length`,这将造成不必要的计算开销。特别是在循环数百万次的情况下,这种重复计算会显著降低程序性能。 针对这个问题,可以...
JavaScript是目前前端开发中最为广泛使用的脚本语言,它提供了多种循环语句来遍历数组和对象,其中for循环是最基础也是最常用的一种。然而,传统的for循环在处理复杂逻辑或大数据集合时可能会影响脚本的执行效率,...
为了解决这个问题,我们可以使用两种方法:一种是生成整个全排列的数组,然后遍历数组得到对应的序号;另一种是从小到大生成 push 数组,然后判断该数是否是当前题目给的数,如果是的话,要求的序号就是当前数组的...
这个方法首先假设数组的第一个元素是最大的,然后遍历数组的其余部分来验证或更新这个假设。最终返回的最大值是整个数组中的最大元素。虽然这种方法有效,但在现代JavaScript中,使用`Math.max`结合`apply`或`reduce...
与`forEach()`类似,`map()`也遍历数组,但它创建一个新的数组,新数组的元素是原始数组元素经过回调函数处理后的结果。例如: ```javascript const numbers = [1, 2, 3, 4, 5]; const squaredNumbers = numbers...
5. **数组方法**:如果员工数据存储在一个数组中,可以利用数组的方法如`map()`、`forEach()`等遍历数组,生成对应的HTML元素。 6. **DOM碎片**:当大量添加元素时,一次性操作可能会导致性能问题。可以使用`...
遍历数组时,虽然可以使用for...in循环,但这种方式可能会遍历到原型链上的属性,因此推荐使用for循环或forEach方法。在使用for循环时,循环的起始条件是0,终止条件是数组的length属性值,每次循环都检查当前索引...
- **思路**:将数组的第一个元素设为当前最大值/最小值,然后遍历数组中的每个元素,与当前最大值/最小值进行比较。 - **优点**:易于理解和实现。 - **缺点**:当数组很大时,性能可能会受到影响。 ##### 2. **...
- 使用 `for` 循环或 `for...in` 循环可以遍历数组和对象,但 `for...in` 主要用于遍历对象的属性。 - `Array.prototype.forEach()` 方法提供了一种更简洁的遍历数组的方式。 8. **异步编程(Asynchronous ...
遍历数组常用的方法有`for`循环、`forEach()`、`map()`、`reduce()`等。 **for循环:** ```javascript for (let i = 0; i ; i++) { console.log(array[i]); } ``` **forEach():** ```javascript array.forEach(...
常规解法是使用两层循环遍历数组,对于每一个元素,再次遍历数组寻找是否存在一个与之相加等于`n`的另一个元素。这种方法的时间复杂度是`O(n^2)`,在数据量大时效率极低,不适用于实际工作中的性能要求。 更优的...
线性扫描法通过遍历数组两次来计算逆序对,第一次遍历排序数组,第二次遍历数组记录逆序对。这种方法时间复杂度为O(n^2),不适合大规模数据。 归并排序法利用了分治策略,将数组分成两半,分别计算两个子数组的逆序...
例如,可以扩展Array原型,添加一个名为each的方法,使用这个方法可以遍历数组中的每个元素,并对每个元素执行给定的函数。这种方式比使用for循环来遍历数组更为简洁,易于阅读和维护。 2. 在迭代中引用原来的对象...
第一个例子是通过数组存储闭包,然后遍历数组执行闭包,观察闭包对变量的引用情况。第二个例子是通过绑定事件处理器的方式,来观察在循环中创建的闭包是如何引用变量的。在这两个例子中,我们都可以发现一个共同的...
`Array.prototype.forEach()`方法遍历数组中的每个元素,执行提供的函数。这里我们可以用它来累加元素。 ```javascript function sum(arr) { var s = 0; arr.forEach(function(val, idx, arr) { s += val; }...
通过排序数组,再遍历数组判断相邻元素是否相同,可以有效地检测出重复的元素。具体步骤如下: 1. 创建一个数组,并使用 sort() 方法对其进行排序。 2. 遍历排序后的数组,检查相邻的两个元素是否相同。 3. 如果发现...
线性查找(Linear Search)是最基础的查找方法,它遍历数组的每一个元素,直到找到目标值或者遍历完整个数组。对于二维数组,线性查找的复杂度会稍高,因为它需要遍历两层:外层遍历行,内层遍历列。 ```javascript...
优化后的代码直接创建数组`info`,并将各子字符串作为数组元素,然后遍历数组弹出警告框,提高了执行效率。 3. 异步加载 JavaScript: - `defer`属性:在HTML中,`<script>`标签的`defer`属性用于延迟脚本执行,...