использование оператора ››› (сдвиг вправо с нулевым заполнением) в Array.prototype.find (polyfill)

Я смотрел на эту функцию Array.prototype.find из (полифилл mdn):

if (!Array.prototype.find) {
  Array.prototype.find = function(predicate) {
    if (this == null) {
      throw new TypeError('Array.prototype.find called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return value;
      }
    }
    return undefined;
  };
}

я не понимаю цель этого кода:

var length = list.length >>> 0;

person gontard    schedule 23.07.2015    source источник
comment
@RGraham - не обманщик (по крайней мере, не в этом вопросе). Другой вопрос заключается в том, что такое оп. Этот спрашивает, какого черта ты используешь это здесь? :)   -  person Mark Kahn    schedule 23.07.2015
comment
@zyklus Ответ в дубликате тоже отвечает   -  person CodingIntrigue    schedule 23.07.2015


Ответы (2)


x >>> 0 заставляет x стать целым числом. Таким образом, если list является массивом, length будет его длиной; но если .length не существует или это что-то глупое вроде {a: 17, length: "Unicorns"}, length будет 0.

person Amadan    schedule 23.07.2015

Существует неявное «приведение к int», присущее любым бинарным операциям javascript. Таким образом, 3.14159 >>> 0 === 3 и любые недопустимые значения, такие как 'foo', преобразуются в 0.

Почему >>> вместо >> или |? Очевидно, они ожидают огромных массивов (но не слишком больших):

Math.pow(2,31)>>0
-2147483648

Math.pow(2,31)>>>0
2147483648
person Mark Kahn    schedule 23.07.2015
comment
@Amadan -- Ты прав, я устал :P - person Mark Kahn; 23.07.2015