Я анализирую собственный JavaScript-код Array.prototype.forEach()
. Я получил его от MDN polyfill на основе оригинала ES5. Я сталкивался с таким выражением, что цель использования в тот момент я не понимаю:Array.prototype.forEach() - почему код этого метода владеет оператором побитового сдвига?
// 2. Let lenValue be the result of calling the Get() internal
// method of O with the argument "length".
// 3. Let len be toUint32(lenValue).
var len = O.length >>> 0;
Я взял polyfill forEach
от MDN, добавлено несколько console.log()
, чтобы проверить, что там происходит и выгружена его родной forEach()
. Мой вывод состоит в том, что я не знаю цели применения там такого побитового сдвига. кусок кода, который я использую для отладки это:
console.log('O: ', O, ' /this: ', this);
var len = O.length >>> 0;
console.log('len: ', len, ' /len === O.length: ', len === O.length, ' /len == O.length: ', len == O.length);
создать некоторый массив, на котором я вызываю «подготовил» forEach
метод, и я не понимаю разницу между переменной len
и имущества O.length
:
[1,3,5].forEach(elem => { console.log('elem: ', elem); })
// O: [1, 3, 5] /this: [1, 3, 5]
// len: 3 /len === O.length: true /len == O.length: true
// elem: 1
// elem: 3
// elem: 5
этот массив содержит 3 элемента и переменной len
, который имеет результат побитового сдвига, выразить это значение тоже.
Я также написал так такие как:
3 >>> 0
// 3
Результат побитового сдвига точен как длина массива. Более того, сравнение между оператором двойного и тройного сравнения ==
/===
дает true
. Длина массива не может быть отрицательной или дробильной. Итак, в чем смысл использования побитового сдвига в нативном коде метода forEach()
?
Комментарий объясняет причину - спецификация ECMAScript заявляет, что значение должно быть преобразовано в UInt32. Вероятно, это дубликат [этого похожего вопроса] (https://stackoverflow.com/questions/22335853/hack-to-convert-javascript-number-to-uint32). –