Для цикла улучшен с оператором ">>>"? - PullRequest
9 голосов
/ 24 ноября 2011

Я обновляю 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++){

как оператор ">>>", используемый таким образом, может улучшить производительность?Что вы думаете об этом?

Ответы [ 4 ]

8 голосов
/ 24 ноября 2011

Битовый оператор >>> ограничен между 0 и 2^32-1 включительно (4 294 967 295). Используя >>>, платформа гарантирует, что цикл не будет выполняться почти бесконечно.

PS. Контекст кода:

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;
    }

Поскольку i инициализируется с нуля и увеличивается на целое число 1, а свойство length всегда является целым числом, отрицательных побочных эффектов нет. Другое применение метода >>> - округление, чтобы преобразовать десятичное число в целое число.

2 голосов
/ 24 ноября 2011

Полагаю, причина в каком-то преобразовании, чтобы убедиться, что значение всегда числовое (в отличие, например, от строки '2').

1 голос
/ 24 ноября 2011

Keeto из команды mootools пролил свет на то, «почему» они это делают, ответ - дженерики и подобные массивы.

Предполагается, что все методы массива также работают как вызовы Array.every / Array.prototype.every. Это означает, что вы можете передать объект с .length: -1 или подобным.

Это гарантирует, что длина не будет недействительной для цикла, я полагаю.

Array.prototype.forEach.call({0:1, length: -1});
0 голосов
/ 24 ноября 2011

Я видел эту технику «битовое смещение на ноль», используемую в качестве метода быстрого усреднения.

Например:

42.8989 >>> 0 == 42

однако, это незаконное присвоение битового сдвига можетсерьезно неправильно, если вы кормите отрицательное число:

(-42.8989) >>> 0 == 4294967254 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...