在Javascript中扩展关联数组的成本?
因为使用JQuery查找节点的成本非常高,所以我构建了一个非常简单的函数在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
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:同意。这就是我所说的“缓存访问,如果它们完全相同”,但我可能还不够清楚。编辑。