2017-02-04 16 views
0

Я анализирую собственный 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()?

+1

Комментарий объясняет причину - спецификация ECMAScript заявляет, что значение должно быть преобразовано в UInt32. Вероятно, это дубликат [этого похожего вопроса] (https://stackoverflow.com/questions/22335853/hack-to-convert-javascript-number-to-uint32). –

ответ

1

Существует множество причин.

[].forEach.call({ length: Math.PI }); 

Array.from({ length: Math.sqrt(2) }); 

Вам не обязательно знать или заботиться о них, но есть причины.

 Смежные вопросы

  • Нет связанных вопросов^_^