Javascript 什么是更快的-$().closest()或本机while循环?
我有自己的下拉列表实现。我将所有列表标识符存储在全局数组中,并在Javascript 什么是更快的-$().closest()或本机while循环?,javascript,jquery,performance,Javascript,Jquery,Performance,我有自己的下拉列表实现。我将所有列表标识符存储在全局数组中,并在窗口中单击事件,我将遍历该数组并决定必须隐藏哪个列表 我需要检查元素是否具有.active类的祖先 jQuery版本: for (var i = 0; i < window.dropdowns.length; i++) { var e = window.dropdowns[i]; if ($(event.target).closest('.active').length == 0) {
窗口
中单击事件,我将遍历该数组并决定必须隐藏哪个列表
我需要检查元素是否具有.active
类的祖先
jQuery版本:
for (var i = 0; i < window.dropdowns.length; i++) {
var e = window.dropdowns[i];
if ($(event.target).closest('.active').length == 0) {
e.hideList();
}
}
for(变量i=0;i
纯javascript版本:
for (var i = 0; i < window.dropdowns.length; i++) {
var e = window.dropdowns[i];
var parent = event.target.parentElement;
while (parent.tagName != 'BODY') {
if (parent.className.indexOf('active') > 0) {
e.hideList();
break;
}
parent = parent.parentElement;
}
}
for(变量i=0;i0){
e、 神秘主义者();
打破
}
parent=parent.parentElement;
}
}
那么,哪个版本的速度更快?性能如何取决于页面上元素的数量?如果您对了解硬数字感兴趣,可以将循环转化为函数,并使用和使用它们。大概是这样的:
//First while loop
console.time(firstWhileLoopInFunction)
console.timeEnd(firstWhileLoopInFunction)
//Second while loop
console.time(secondWhileLoopInFunction)
console.timeEnd(secondWhileLoopInFunction)
如果您对了解硬数字感兴趣,您可以将循环转换为函数,并在其上使用和。大概是这样的:
//First while loop
console.time(firstWhileLoopInFunction)
console.timeEnd(firstWhileLoopInFunction)
//Second while loop
console.time(secondWhileLoopInFunction)
console.timeEnd(secondWhileLoopInFunction)
如果你只是想知道什么是最快的,去发现。如果你想知道为什么
jQuery将做比您需要的更多的工作,例如,您只测试标记名和类名 话虽如此,您的代码可能会给出误报,因为如果元素的类为notactive,则
className.indexOf('active')
将返回>-1。改用classList
最后,如果您已经在使用jQuery,那么应该使用它,因为我们刚刚向您展示了我们自己编写的代码可能有缺陷,在这种情况下,性能可能并不重要
记住,过早优化是许多意大利面代码的根源。如果你只是想知道什么是最快的,那就去看看吧。如果你想知道为什么
jQuery将做比您需要的更多的工作,例如,您只测试标记名和类名 话虽如此,您的代码可能会给出误报,因为如果元素的类为notactive,则
className.indexOf('active')
将返回>-1。改用classList
最后,如果您已经在使用jQuery,那么应该使用它,因为我们刚刚向您展示了我们自己编写的代码可能有缺陷,在这种情况下,性能可能并不重要
请记住,过早优化是许多意大利面条式代码的根源。您可能应该使用jQuery方法而不是父类,因为如果找到元素,它将停止迭代,而父类则不会。请在此阅读更多内容,谢谢,@Esko。但问题仍然存在。最接近的
会比循环时的快吗?我将更新我的问题。为什么不试试看呢?简单的性能问题,可以很容易地测试。查询将做比您需要更多的工作,例如,您只测试标记名和类名。话虽如此,您的代码可能会给出误报,因为如果元素的类为notactive,则className.indexOf('active')
将返回>-1。改用classList。最后,如果您已经在使用jQuery,那么您应该使用它,因为我们刚刚向您展示了我们自己编写的代码可能存在缺陷,并且性能可能并不重要。在这种情况下,您可能应该使用jQuery方法,而不是父代,因为如果找到元素,它将停止迭代,父代不会。请在此阅读更多内容,谢谢,@Esko。但问题仍然存在。最接近的会比循环时的快吗?我将更新我的问题。为什么不试试看呢?简单的性能问题,可以很容易地测试。查询将做比您需要更多的工作,例如,您只测试标记名和类名。话虽如此,您的代码可能会给出误报,因为如果元素的类为notactive,则className.indexOf('active')
将返回>-1。改用classList。最后,如果您已经在使用jQuery,那么应该使用它,因为我们刚刚向您展示了我们自己编写的代码可能有缺陷,在这种情况下,性能可能并不重要