我测量了这两个功能的执行时间:
> jQuery grep功能
Native JavaScript filter功能
// 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; }); }
单词数组由一百万个随机生成的字符串构成.每种方法都运行20次.在我的惊喜jQuery grep功能更快.
执行时间(20次执行):
> jQuery grep功能26,31s
> Native JavaScript filter功能34,66s
您可以重复这个jsFidle的测量 – 这将需要一些时间来执行,以便耐心等待.
是否有任何解释为什么jQuery grep功能比本机JavaScript filter功能更快?
PS:这个问题的灵感来自于answer.
解决方法
通过比较页面上的.grep使用的jQuery函数
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指定为Array.prototype.filter
.
它看起来像我一样的.filter强制它是对Object,检查回调IsCallable并设置它在它以及检查每个迭代中属性的存在,而.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)相同的时间.