Array.prototype上方法的polyfill解疑

去看MDN上Array.prototype上的方法,ES5.1和ES6之后的方法,文档都给出了polyfill,基本上所有的polyfill都有下面两行代码:

var O = Object(this);
var len = O.length >>> 0;

当时我看到这两行的时候,就产生了疑惑,为什么要把this强制转换成对象,这些方法不是在Array.prototype上吗?this一定会是array类型啊,一定会有length属性啊。

后来思考了之后才发现这两行代码并不是画蛇添足。

因为即使是在prototype上的方法,也可以赋值给别的原型作为属性,这时候this的类型就不一定了。

someOtherType.prototype.map = Array.prototype.map

还有一个原因就是,虽然这些方法在Array.prototype上,但是它们可以被call和apply调用,这时候this的类型也是不确定的。

因此就需要强制转换成对象,并且length属性需要无符号右移0位。原因如下:

undefined >>> 0 //0

如果length属性不存在,无符号右移0位后会是0而不是undefined,确保length属性一定会有值。

posted @ 2018-08-04 17:33  hahazexia  阅读(425)  评论(0)    收藏  举报