Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.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/73.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中扩展关联数组的成本?_Javascript_Jquery - Fatal编程技术网

在Javascript中扩展关联数组的成本?

在Javascript中扩展关联数组的成本?,javascript,jquery,Javascript,Jquery,因为使用JQuery查找节点的成本非常高,所以我构建了一个非常简单的函数 window.selectorToObject = {} function get(selector){ if(typeof selector === "undefined") return null; if(selector in window.selectorToObject) return window.selectorToObject[selector]; wi

因为使用JQuery查找节点的成本非常高,所以我构建了一个非常简单的函数

window.selectorToObject = {}

function get(selector){
    if(typeof selector === "undefined") 
      return null;
    if(selector in window.selectorToObject) 
      return window.selectorToObject[selector];
    window.selectorToObject[selector] = $(selector);
    return $(selector);
}
因此,我们不必执行
$(选择器)
而只需
获取(选择器)

经过简单测试后,差异显著:

<div id="test">
  <div id="child1">
    <div id="child2">
       <div id="child3"></div>
    </div>
  </div>
</div>

现在我只担心关联数组的大小会随着每个新的
get()
而增加


在Javascript中扩展关联数组的大小会有任何代价吗?

只有在对同一选择器进行大量调用时,这才有帮助。如果您正在这样做,那么是的,这可能会有所帮助,但是如果访问完全相同,您应该在本地范围的变量中缓存访问

但是,在动态内容的情况下,您也可以断开选择器。如果调用
get('.mydiv')
然后稍后添加另一个
get()
将返回缺少最新
div
的对象

正如你提到的,这里也有内存成本。您正在用速度换取内存占用。一般来说,这不是问题,但是jQuery选择器的性能也不是问题,除非您执行大量选择器调用


实际上,我怀疑是否有人需要这样做。不要去优化,除非它是一个真正的问题。您应该始终注意编写好的代码,但要克制过度优化的冲动。

从技术上讲,JS是一个对象,而不是一个关联数组。但您仍然在执行
$()
在第一个实例中使用两次-这比任何jQuery代码块(如果选择器被缓存在变量中)都要多一次-如果它被多次使用,它应该总是这样。理论上,这和一些编写良好的jQuery之间应该没有任何性能差异。你能链接到你的jsperf测试吗?你的页面真的太大了以至于这是一个实际问题吗?不要屈服于过早的优化。如果您无法感觉到文档速度减慢,请不要浪费时间试图绕过它。您多久访问一次相同的选择器?当然,jsPerf测试将显示出巨大的差异,但是您真的要访问同一个元素一百万次(大约一百万次)吗?这听起来像是一个bug,只要您在页面上执行任何动态操作,它就会发生。将选择器结果缓存在靠近其使用位置的位置会更清晰。我同意这一点,但根据我的经验,如果您的页面使用同一个选择器进行了如此多的调用,那么您可能会从中受益更多,方法是在某些附件中使用一个变量作用域,以单独使用的方式存储选择器,而不是使用您的方法缓存jquery对象。@codefactor:同意。这就是我所说的“缓存访问,如果它们完全相同”,但我可能还不够清楚。编辑。