我正在将mootools从1.3.2更新到1.4.1。 我看到了一个奇怪的变化。从这个
for (var i = 0, l = this.length; i < l; i++){....
到这个
for (var i = 0, l = this.length >>> 0; i < l; i++){
如何“&gt;&gt;&gt;”以这种方式使用的运算符可以提高性能吗?你觉得怎么样?
答案 0 :(得分:8)
>>>
位运算符在0和2^32-1
(4,294,967,295)之间包含并包含0和>>>
。通过使用Array.implement({every: function(fn, bind){
for (var i = 0, l = this.length >>> 0; i < l; i++){
if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
}
,框架可确保循环不会在近乎无限的时间内执行。
PS。 代码的上下文:
i
由于length
初始化为零,并且增加了整数1,并且>>>
属性始终为整数,因此没有负面的副作用。 {{1}}方法的另一个应用是舍入,将十进制数转换为整数。
答案 1 :(得分:2)
我想原因是某种转换以确保该值始终为数字(而不是例如字符串'2')。
答案 2 :(得分:1)
所有数组方法都应该用作Array.every / Array.prototype.every调用。这意味着,您可以传递.length:-1或类似的对象。
这可以确保循环失败的长度不会无效,我想。
Array.prototype.forEach.call({0:1, length: -1});
答案 3 :(得分:0)
我已经看到这种“零位移”技术被用作一种快速的截断方法。
e.g:
42.8989 >>> 0 == 42
然而,如果你输入一个负数,这种对位移的误用可能会严重错误:
(-42.8989) >>> 0 == 4294967254