In https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill
有一条线像
// Steps 1-2.
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this); // <- WHAT IS THIS???????????
// Steps 3-5.
var len = O.length >>> 0;
// Steps 6-7.
var start = arguments[1];
var relativeStart = start >> 0;
// Step 8.
var k = relativeStart < 0 ?
Math.max(len + relativeStart, 0) :
Math.min(relativeStart, len);
// Steps 9-10.
var end = arguments[2];
var relativeEnd = end === undefined ?
len : end >> 0;
// Step 11.
var final = relativeEnd < 0 ?
Math.max(len + relativeEnd, 0) :
Math.min(relativeEnd, len);
// Step 12.
while (k < final) {
O[k] = value;
k++;
}
// Step 13.
return O;
我找不到将 O 指定为 Object(this) 的任何必要性。
它只是为了可读性而编写还是有任何特定的分配原因?
正如代码注释中所建议的,本节将准确地填充记录在中的第一个步骤the spec.
- 设 O 为 ToObject(该值)。
- 如果突然返回(O)。
虽然有点乱序,但这正在执行以下功能ToObject(this value)
:
var O = Object(this);
基本上,如果在非对象上调用它,则非对象应该转换为Object
.
例如,如果我们要在原生支持此方法的 JavaScript 引擎中运行这段大部分无意义的代码,我们会看到Number
返回对象实例。
Array.prototype.fill.call(123);
该行将确保 Polyfill 获得相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)