Ich analysiere native JavaScript-Methode Array.prototype.forEach()
Code. Ich habe es von MDN polyfill basierend auf Original ES5. Ich begegnete solchen Ausdruck, der Zweck der Nutzung in diesem Punkt verstehe ich nicht:Array.prototype.forEach() - warum der Code dieser Methode bitweisen Verschiebungsoperator besitzt?
// 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;
ich polyfill nahm forEach
von MDN, fügte ein paar console.log()
zu überprüfen, was dort vor sich geht und tauschte es für native forEach()
. Meine Schlussfolgerung ist, dass ich den Zweck der Anwendung einer solchen bitweisen Verschiebung nicht kenne. Ein Stück Code, das ich dies debuggen bin mit:
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);
Ich schaffe etwas Array, auf dem ich „vorbereitet‘ forEach
Methode aufrufen, und ich verstehe nicht den Unterschied zwischen variablen len
und Eigentum 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
das Array 3 Elemente variable und len
enthält, das Ergebnis der bitweisen Verschiebung hat auch diesen Wert auszudrücken.
ich schrieb auch so so:
3 >>> 0
// 3
Das Ergebnis der bitweisen Verschiebung ist genau wie die Länge der Array. Darüber hinaus ergibt der Vergleich zwischen dem Doppel- und Dreifach-Vergleichsoperator ==
/===
true
. Array-Länge kann weder negativ noch Bruchzahl sein. Also, was ist der Punkt der Verwendung von bitweiser Verschiebung in nativen forEach()
Methodencode?
Der Kommentar erläutert den Grund - die ECMAScript-Spezifikation besagt, dass der Wert in ein UInt32 konvertiert werden sollte. Dies ist wahrscheinlich ein Duplikat von [diese ähnliche Frage] (https://stackoverflow.com/questions/22335853/hack-to-convert-javascript-number-to-uint32). –