2010-11-02 4 views
15

Можно создать дубликат:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)Что делает х >>> 0?

Я пытался некоторые функциональные концепции программирования в проекте шахты, и я читал о Array.prototype.map, который является новым в ES5 и выглядит это:

Array.prototype.map = function(fun) { 
    "use strict"; 
    if (this === void 0 || this === null) { 
     throw new TypeError(); 
    } 
    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") { 
     throw new TypeError(); 
    } 
    var res = new Array(len); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
     if (i in t) { 
      res[i] = fun.call(thisp, t[i], i, t); 
     } 
    } 
    return res; 
}; 

Что мне интересно, почему это делает t.length >>> 0. Потому что это ничего не делает. x >>> 0 //-> x! (пока x является числом, очевидно)

Также обратите внимание, что я не знаю, как работают побитовые операторы.

+0

и много других http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ HTTP: // stackoverflow.com/questions/3348438/ Их легко найти только при первом обнаружении> _>. – kennytm

+1

@KennyTM ~ Хорошие дубликаты, если вы знаете, что имена вещей ...;) – jcolebrand

ответ

21

x >>> 0 выполняет логическое (без знака) смещение вправо 0 бит, что эквивалентно отсутствию-op. Однако перед правым сдвигом он должен преобразовать x в 32-битное целое без знака. Следовательно, общий эффект x >>> 0 преобразует x в 32-разрядное целое без знака.

Это гарантирует, что len является неотрицательным числом.

js> 9 >>> 0 
9 
js> "9" >>> 0 
9 
js> "95hi" >>> 0 
0 
js> 3.6 >>> 0 
3 
js> true >>> 0 
1 
js> (-4) >>> 0 
4294967292 
+0

Не могли бы вы объяснить, почему something.length будет меньше 0? – Patriks

+0

@Pratik И почему это было бы «правда»? Вероятно, для этого нет реальной причины. Но если это произошло (случайно, например), это сломает '.map'. Пример кода: 'Array.prototype.map.call ({length: -2}, f)' – m93a