在 JavaScript find() polyfill 中使用位移运算符

Use of bitshift operator in JavaScript find() polyfill

谁能解释为什么 >>> 移位运算符在 the Array.find() polyfill shown on the MDN website:

中是必需的
....
var list = Object(this);
var length = list.length >>> 0;
....

我知道它有时被用作将浮点值截断为整数的丑陋方法,但这里似乎不是这种情况,因为 listlength 值会无论如何都是一个整数。

您可以 applyArray.prototype.find() 方法应用于具有整数属性 >= 0 和 length 属性 的任何对象。然后将它的 length 属性 首先截断成一个整数可能是安全的,以防我们奇异数组的 length 属性 是计算的 属性 而不是完美的整数。由于 Math.trunc() 是一个 ES6 功能,它符合 Polyfill 的性质,可以使用带有 0 参数的 >>> 运算符。

var obj = {7:"g", 1:"b", 2:"c", 0: "a", length: 4.7},
    val = [].find.call(obj, v => v === "c");
console.log(val);

I understand it is sometimes used as an ugly way to truncate floating point values to integers

不完全是。 value >>> 0 是使用 ToUint32(value) 抽象操作的唯一公开方式。

Arrays 具有不变性,即它们的长度必须是 Uint32 值:

Every Array object has a length property whose value is always a nonnegative integer less than 232.

这就是规范在数组方法定义中到处使用 ToUint32 的原因。 Polyfills 使用 >>> 0 而不是 ToUint32 因为 ToUint32 没有暴露给 JS 代码。

您需要使用 ToUint32,因为您无法知道数组方法中的 this 是什么,它可以是非数组对象甚至是基元。否则 Object(this) 也没有必要。