Chr*_*oph 36 javascript performance jquery
在一个问题中讨论了jQuery和本机JS如何相互执行.
当然,vanilla解决方案的执行速度要快得多,因为它不处理整个阵列我提出的使用方法Array.filter,我非常自信至少会比这更快$.grep.
令人惊讶的是,在将它添加到测试中后,我接受了一个教训:Testsuite
Edgecases当然有不同的结果.
任何人都知道为什么$.grep应该比原生方法快3倍Arrray.filter?
编辑:我修改了测试以使用来自MDN的过滤器垫片,结果非常有趣:
最后一个像我希望它能看到的结果
ECMAScript 5.1规范的第15.4.4.20节定义Array.prototype.filter(callbackfn, thisArg)如下:
callbackfn应该是接受三个参数,并返回一个值,该值是强制转换为布尔值的函数true或false.为数组中的每个元素filter调用callbackfn一次,按升序排列,并构造一个callbackfn返回所有值的新数组true.callbackfn只调用实际存在的数组元素; 它不会被调用缺少数组的元素.如果
thisArg提供了参数,它将用作this每次调用的值callbackfn.如果未提供,undefined则使用.
callbackfn使用三个参数调用:元素的值,元素的索引和被遍历的对象.
filter不会直接改变调用它的对象,但是对象可能会被调用变异callbackfn.过滤器处理的元素范围在第一次调用之前设置
callbackfn.在调用过滤器开始后附加到数组的元素将不会被访问callbackfn.如果更改了数组的现有元素,则传递给它们的值callbackfn将是过滤器访问它们时的值; 不会访问在调用过滤器之后和访问之前删除的元素.
这本身就已经很多了; ECMAScript引擎需要执行的许多步骤.
然后继续说以下内容:
使用一个或两个参数调用filter方法时,将执行以下步骤:
让我们
O调用ToObject传递this值作为参数的结果.让我们用参数lenValue调用[[Get]]内部方法.我们是.如果IsCallable(callbackfn)为false,则抛出TypeError异常.如果提供thisArg,则让T为thisArg; 否则让T不确定.设A是一个新的数组,就像表达式new Array()一样,其中Array是具有该名称的标准内置构造函数.令k为0.设为0.重复,而k <len让Pk为ToString(k).设kPresent是用参数Pk调用O的[[HasProperty]]内部方法的结果.如果kPresent为真,那么让kValue成为用参数Pk调用O的[[Get]]内部方法的结果.设选为调用callbackfn的[[Call]]内部方法的结果,使用T作为包含kValue,k和O的此值和参数列表.如果ToBoolean(selected)为true,则调用[[DefineOwnProperty]]带有参数ToString(to)的A的内部方法,属性描述符{[[Value]]:kValue,[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true}和false.增加1.将k增加1.返回A.OlengthlenToUint32(lenValue)filter方法的length属性为1.
注意过滤功能是有意通用的; 它不要求它的这个值是一个Array对象.因此,它可以转移到其他类型的对象以用作方法.过滤器功能是否可以成功应用于主机对象取决于实现.
有关此算法的一些注意事项:
在很多情况下,这些都不需要.因此,在编写filter自己的方法时,大多数时候您甚至都不愿意执行这些步骤.
每个符合ES5.1标准的JavaScript引擎都必须符合该算法,因此每次使用时都必须执行所有这些步骤Array#filter.
毫不奇怪任何只执行这些步骤的自定义编写方法会更快:)
如果你编写自己的filter函数,很可能它不会像上面的算法那么复杂.也许您根本不会将数组转换为对象,因为根据用例,可能不需要仅仅过滤数组.