jAn*_*ndy 4 javascript jquery ecma262
Javascript(ECMAscript)Array.prototype.forEach从版本1.6(ECMAscript edition 3,2005)开始支持该方法.因此,相当多的浏览器已经支持该方法,并且与jQuery的$.each()方法相比,它的速度非常快.
(实际上它胜过所有实现,无论哪个Javascript库)
与jQuery相比,它的速度提高了约60-70%.在JSPerf 上使用forEach和jQuery自己尝试一下.
到目前为止我唯一使用它的缺点是,我无法想象早点打破迭代的方法.喜欢for,while并且do-while有一个break声明,jQuerys .each()支持return false打破循环.
我查看了ECMAScript第5版规范(我发现的最新版本),但他们没有提到从该循环中提前中断.
所以,问题,Douglas Crockford先生会称之为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;
}
});
Run Code Online (Sandbox Code Playgroud)
这是"真正的"生产代码.我找了一个查找css3转换属性的好方法,我迷失了ecma5规范和奇怪的Javascript论坛:-)
因此,您可以将数组对象本身作为第三个参数传递给.forEach回调.我从原始数组创建一个副本,一旦找到我正在寻找的东西,就调用slice(0)并将其.length属性设置为0.效果很好.
如果有人提出了更好的解决方案,我当然会编辑它.
好吧,你可以every改用.true如果提供的回调函数true为数组中的每个元素返回(truthy),则该函数被设计为返回false.这里的关键点是,一旦回调函数返回一个错误的值,every立即返回false而不迭代数组的其余部分.所以只要忽略返回值,every就好像它一样对待forEach.
[1, 2, 3, 4, 5].every(function(e) {
alert(e);
if (e > 2) return false; //break
return true;
});
Run Code Online (Sandbox Code Playgroud)
在这个例子中,alert只会发射3次.
当然,这里最大的问题是,如果你想让循环继续,你必须返回一个真值.事实上,如果你什么都不返回(未定义),循环将停止.或者,你可以使用some哪种行为完全相反; 当回调函数返回一个truthy值时,immediatly返回true,如果它从未返回,则返回false.在这种情况下,return true将是你的"休息"声明.向后是的,但它可以让你不必return true简单地让循环继续.
现在,如果你对性能有所了解,我建议只使用一个普通的for循环,因为调用functionas时会产生很大的开销,而这些函数会在较大的数组中很快加起来.使用本机函数有所帮助,但重复调用用户定义函数的开销仍然存在且非常重要.至少这是我的经验,你当然应该做自己的测试.
| 归档时间: |
|
| 查看次数: |
1241 次 |
| 最近记录: |