Ответ 1
Сравнивая фактическую функцию 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
}
(отметьте здесь для неограниченного, спасибо Alexander) против алгоритм, указанный для
Мне кажется, что .filter
заставляет свой this
Object, проверяет обратный вызов IsCallable
и устанавливает в нем this
, а также проверяет наличие свойства на каждой итерации, тогда как .grep
принимает и пропустит эти шаги, что означает, что происходит немного меньше.
Объедините это с тем, насколько хорош компилятор JavaScript в Chrome, и вы можете найти разницу в скорости.
Добавление некоторых из них в $.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
(изменено Alexander jsperf).