在MDN中针对某些Array原型函数的几个polyfill示例中,有以下两行(例如:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find):
var list = Object(this);
var length = list.length >>> 0;
我认为第一个例子是自动装箱(?)。但是,无论如何this
总是成为一个数组,它的目的是什么呢?
第2行,这有何不同:
var length = list.length || 0;
谢谢!
答案 0 :(得分:6)
这使得可以在严格模式下使用call
或apply
调用函数,而不是数组,而是遵循规范。
如果它是Array
的实例,或类似数组的对象,则它不会改变任何内容。
但是在这里,因为确保list
是对象的这一行遵循this
既不是null
也不是undefined
的检查,并且其他值不会使以下访问失败(除了Object(this)
无法解决的特殊情况,例如失败的访问者),我不确定是否真的有意义。也许它是在检查之前设置的,或者它可能就在特殊的原生对象的情况下。另一种可能性是它(也是?)一步一步严格遵循specification并想要应用toObject。
list.length >>> 0
优于|| 0
,因为它舍入到最接近的较低正整数(在32位范围内)。我不确定为什么>>
在这里没有被使用,因为迭代到4294967295而不是-1(即不要浪费时间)似乎不是更好。