【问题标题】:Array.prototype.forEach() - why code of that method owns bitwise shift operator?Array.prototype.forEach() - 为什么该方法的代码拥有按位移位运算符?
【发布时间】: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


【解决方案1】:

有很多原因。

[].forEach.call({ length: Math.PI });

Array.from({ length: Math.sqrt(2) });

你不必知道或关心他们,但有原因。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2011-04-19
    • 2012-11-12
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多