在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)。
它是为了可读性而编写还是有任何具体的分配原因?
答案 0 :(得分:3)
正如对代码的评论中所建议的那样,本节将准确地填写the spec中记录的第一步。
- 设O为ToObject(此值)。
- ReturnIfAbrupt(O)。
醇>
虽然有点无序,但这是在执行ToObject(this value)
:
var O = Object(this);
基本上,如果在非对象上调用它,则应将非对象强制转换为Object
。
例如,如果我们在本机支持此方法的JavaScript引擎中运行这些大多数无意义的代码,我们会看到返回Number
对象实例。
Array.prototype.fill.call(123);
该行将确保polyfill的结果相同。
答案 1 :(得分:1)
当参数已经是对象时,Object构造函数返回其参数。如果它不是一个对象,它返回参数的“objectified”版本:一个String实例,如果它是一个字符串,一个Number实例,如果它是一个数字,等等。
有问题的函数有点奇怪,特别是this
的值通常无论如何都是。它不会有,但是你必须尽可能地使用不是对象的this
值来到达polyfill的内部。