Javascript (ECMAscript)Array.prototype.forEach
从版本 1.6 (ECMAscript edition 3, 2005) 开始支持该方法。因此,相当多的浏览器已经支持该方法,并且与 jQuery 的$.each()
方法相比,它的速度非常快。
(实际上它击败了所有的实现,不管是哪个 Javascript 库)
与 jQuery 相比,它的速度大约快 60-70%。在 JSPerf上的forEach 与 jQuery上自己尝试一下。
到目前为止,我使用它的唯一缺点是,我无法想办法尽早中断迭代。Like for
, while
and do-while
have a break
statement, jQuerys.each()
支持return false
打破循环。
我查看了ECMAScript 第 5 版规范(我发现的最新版本),但他们没有提到该循环的早期中断。
那么,问题来了,道格拉斯·克罗克福德先生会称其为design error
吗?
我是否遗漏了什么并且有可能提前打破这样的循环?
编辑
感谢您到目前为止的答案。我想既然没有人想出一个“本机”解决方案,那真的没有实现(也许是一个特性?)。无论如何,我不太喜欢建议的方法,所以我胡闹了一下,终于找到了我喜欢的方法(至少,更好)。好像:
var div = document.createElement('div'),
divStyle = div.style,
support = jQuery.support,
arr = ['MozTransform', 'WebkitTransform', 'OTransform'];
arr.slice(0).forEach(function(v,i,a){
if(divStyle[v] === ''){
support.transform = v;
a.length = 0;
}
});
这是“真正的”生产代码。我寻找了一种查找 css3 转换属性的好方法,但我迷失在 ecma5 规范和奇怪的 Javascript 论坛中:-)
因此,您可以将数组对象本身作为第三个参数传递给.forEach
回调。我从原始数组创建一个副本,一旦找到我要查找的内容,就会调用slice(0)
并将其属性设置为 0。.length
效果很好。
如果有人提出更好的解决方案,我当然会编辑它。