ネイティブJavaScriptメソッドArray.prototype.forEach()
を解析しています。元ES5に基づいてMDN polyfillから得ました。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;
は、私は、MDNからポリフィルforEach
を取ったが何が起こっているかをチェックするために、いくつかの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
が含ますぎるその値を表現する。
私もそう書いそのようmething:
3 >>> 0
// 3
ビット単位のシフトの結果は、配列の長さとして正確です。さらに、二重比較演算子==
/===
の比較では、true
が得られます。配列の長さは、負数でも小数でもかまいません。だからネイティブのforEach()
メソッドコードでビット単位のシフトを使用する点は何ですか?
このコメントは理由を説明しています - ECMAScript仕様では、値をUInt32に変換する必要があると記載されています。これは恐らく[この類似の質問](https://stackoverflow.com/questions/22335853/hack-to-convert-javascript-number-to-uint32)の複製です。 –