Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 特定循环(html元素)方法的优缺点_Javascript_Jquery_Html - Fatal编程技术网

Javascript 特定循环(html元素)方法的优缺点

Javascript 特定循环(html元素)方法的优缺点,javascript,jquery,html,Javascript,Jquery,Html,我有JS生成的html部分,如下所示: <div id="container"> <div id="block_1" class="blocks"></div> <div id="block_2" class="blocks"></div> <div id="block_3" class="blocks"></div> ... <div id="block_n" cl

我有JS生成的html部分,如下所示:

<div id="container">
    <div id="block_1" class="blocks"></div>
    <div id="block_2" class="blocks"></div>
    <div id="block_3" class="blocks"></div>
    ...
    <div id="block_n" class="blocks"></div>
</div>
var blocks = $(".blocks");
$.each(blocks, function() {
      var val = $(this).text();
      ...
});
但我也可以去:

for (var i=1; i<=block_count; i++) {
    var val = $("#block_"+i).text();
    ...
}

for(var i=1;iJavascript中有大量的性能提示

请看这里:

<>太长了,读不下去了,你会发现非常有用的信息,但是TL;DR是现在最快的循环,适合你的情况:

var blocks = document.getElementsByClassName("blocks");
for (var i=0, len = blocks.length; i<len; i++) {
    var val = blocks[i].textContent;
    ...
}
var blocks=document.getElementsByClassName(“块”);

对于(var i=0,len=blocks.length;i我相当肯定,
$(“#block_”+i)
的成本将足够高,与
$(this)
相比,它将抵消通过使用更高效的
for
循环而获得的任何性能增益。这可能会稍微更高效一些:

var blocks = $(".blocks");
for(var i = 0, len < blocks.length; i++) {
      var val = $(blocks[i]).text();
      ...
});
var blocks=$(“.blocks”);
对于(变量i=0,len
然而,可以肯定的是,无论您在循环中做什么,都会非常昂贵,以至于您都不会看到显著的改进


如果性能是一个问题,我建议您采用高级方法,看看是否可以在设计或算法级别上进行大规模改进。否则,只需使用最容易维护的代码。

一般来说,您的代码应该避免在不需要时使用选择器和jQuery构造函数。更高性能的版本对于只构造一组元素一次的代码,如下所示:

//保存对整个集合的引用;您需要更新
//这将随着列表的增长而变化。您可以使用blocks.add()添加新的
//已创建元素到同一集合。它可能比
//每次都必须重新选择整个集合。
var blocks=$('.blocks','#container');
//使用回调函数迭代每个项
//接收索引号(0索引)和实际
//每个ITE操作中的HTMLElement
块。每个(功能(idx,项){
//在这种情况下,`this`和`item`是同一件事
console.log(this==项);
//'item'是一个HtmleElement,它不是包装的jQuery对象
var text=item.textContent;
//还可以使用索引获取jQuery项对象;
//这不需要您构造新的jQuery对象
var$item=blocks.eq(idx);
var值=$item.val();
});

$(“.blocks”)。每个(函数(){…})
会更具可读性,但现在这实际上取决于你所说的
哪种方式更好
,哪种方式更好???性能更好?如果是这样,请使用本机js方法。jsperf已关闭,但我从jsperf的屏幕截图和一些解释中发现了这一点。只要说一下你想做什么,你肯定不需要循环o一次又一次地检查所有元素。如果你提供一个更具体的示例,说明你为什么需要这些元素,我相信有比每次循环检查完整的元素列表更好的方法,我需要。我必须检查它们的数据,并根据它们中的每一个创建新的元素。可能的重复。你能提供更多有关此建议如何应用的详细信息吗是的,但是他在循环中做了一个额外的ID选择,这可能会超过他从使用基于迭代器的循环中获得的任何性能收益。你是对的,但他的问题是他以哪种方式获得性能。但是这个收益没有那么大,而且“TL;DR”我发布了循环数组的最快方法。但是这并不适用于所有情况(例如,浏览器可能有不同的JS引擎实现),我正在编辑答案以适应用户情况,谢谢:)谢谢改进您的答案+1嗯,我无法改进算法。但是谢谢。最后是一个准确的答案,这符合我的“超宽”问题。是一个属性,而不是一个函数。它也不受支持的权利,我的坏,没有检查输出。