Analizuję kod wbudowanej w JS metody Array.prototype.forEach(). W kodzie dostępnym na MDN jako polyfill na bazie ES5 jest takie oto wyrażenie:
// 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;
To jest jeden z tych rzadkich momentów, gdy mimo pisania w języku wysoko poziomowym przydało by się wiedzieć, jak coś działa na poziomie bardziej matematycznym...
Ok - nie wiem, ale podmieniając natywny forEach na ten z MDN (tak po prostu w przeglądarkowej konsoli) oraz dodając tam console.log() doszedłem do wniosku, że nie znam celu, dla którego ma tam miejsce przesunięcie bitowe. Kawałek kodu, który staram się debugować:
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 );
I teraz tworzę sobie jakąś tablicę, na której wywołuję "spreparowany" Array.prototype.forEach() i nie rozumiem czym różni się wartość zmiennej len od 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
Tablica zawiera 3 elementy, a zmienna len, która otrzymała wynik przesunięcia bitowego z pola length, też wskazuje 3.
Zapisałem sobie jeszcze coś takiego:
3 >>> 0
// 3
A zatem wynik tego całego przesunięcia bitowego jest równy z długością tablicy. Ponadto porównanie z użyciem podwójnego jak i potrójnego operatora porównania == / === wykazało true. Jeśli tak, to po co wykonywać taką operację? Długość tablicy nie może być ujemna, nie może być wartością niecałkowitą - więc po co to stosować, skoro wynik jest równy po prostu długości tablicy?