2017-02-04 5 views
0

ネイティブ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()メソッドコードでビット単位のシフトを使用する点は何ですか?

+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) }); 

あなたはそれらについて知っているか気にする必要はありませんが、理由はあります。

関連する問題