【发布时间】:2017-02-04 21:11:09
【问题描述】:
我正在分析原生 JavaScript 方法 Array.prototype.forEach() 代码。我从MDN polyfill 得到它,基于原始ES5。遇到过这样的表达,不明白当时的使用目的是什么:
// 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 获取了 polyfill 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,它有按位移位的结果,也表示该值。
我也写过类似的东西:
3 >>> 0
// 3
按位移位的结果与数组长度完全相同。此外,双重和三重比较运算符== / === 之间的比较产生true。数组长度既不能是负数也不能是小数。那么在原生forEach()方法代码中使用按位移位有什么意义呢?
【问题讨论】:
-
评论解释了原因 - ECMAScript 规范声明该值应转换为 UInt32。这可能是 this similar question 的副本。
标签: javascript foreach bit-shift