在 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;
....
我知道它有时被用作将浮点值截断为整数的丑陋方法,但这里似乎不是这种情况,因为 list
的 length
值会无论如何都是一个整数。
您可以 apply
将 Array.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)
也没有必要。
谁能解释为什么 >>>
移位运算符在 the Array.find() polyfill shown on the MDN website:
....
var list = Object(this);
var length = list.length >>> 0;
....
我知道它有时被用作将浮点值截断为整数的丑陋方法,但这里似乎不是这种情况,因为 list
的 length
值会无论如何都是一个整数。
您可以 apply
将 Array.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)
也没有必要。