我测量了这两个函数的执行时间:
使用Chrome配置文件工具测量了以下方法的执行情况:
// jQuery GREP function
function alternative1(words, wordToTest) {
return $.grep(words, function(word) {
return wordToTest.indexOf(word) != -1;
});
}
// Native javascript FILTER function
function alternative2(words, wordToTest) {
return words.filter(function(word) {
return wordToTest.indexOf(word) != -1;
});
}
words
数组由100万个随机生成的字符串构成。每种方法运行20次。令我惊讶的是jQuery
grep函数更快。
执行时间(20次执行):
您可以对此jsFidle重复测量 - 执行需要一些时间,请耐心等待。
有没有解释为什么jQuery grep功能比原生 JavaScript filter功能更快?
PS:这个问题的灵感来自answer。
答案 0 :(得分:12)
通过比较页面上实际使用的jQuery函数$.grep
function (a, b, c) {
var d = [],
e;
c = !! c;
for (var f = 0, g = a.length; f < g; f++) e = !! b(a[f], f), c !== e && d.push(a[f]);
return d
}
(针对
指定的here检查Alexander是否为非缩小,感谢the algorithm)我认为.filter
会强制其this
到对象,检查回调IsCallable
并在其中设置this
以及检查每次迭代中是否存在属性,而.grep
假定并跳过这些步骤,这意味着继续进行的操作略有减少。
将此与Chrome中的JavaScript编译器的优点相结合,您可能会发现速度差异。
将其中一些添加到$.grep
会使其看起来像
function (elems, callback, inv, thisArg) {
var ret = [],
retVal;
inv = !!inv;
for (var i = 0, length = elems.length; i < length; i++) {
if (i in elems) { // check existance
retVal = !!callback.call(thisArg, elems[i], i); // set callback this
if (inv !== retVal) {
ret.push(elems[i]);
}
}
}
return ret;
}
与.filter
(modified Alexander's jsperf)大致相同。