2016-08-25 3 views
5

В 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 как объект (это).

Это написано только для удобства чтения или есть какие-либо конкретные причины для назначения?

+1

Ну, это следует только за шагами алгоритма в спецификации. И там он говорит: «Пусть О будет? ToObject (это значение). Http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.fill –

ответ

3

Как указано в комментариях к коду, этот раздел предназначен для точной проверки первых шагов, описанных в the spec.

  1. Пусть О ToObject (это значение).
  2. ReturnIfAbrupt (O).

Хотя немного испорченный, это выполнение fucntion из ToObject(this value):

var O = Object(this); 

В принципе, если она вызывается не-объект, не-объект должен быть бросили на Object.

Например, если бы мы запускали этот бит в основном-бессмысленного кода в движке JavaScript, который поддерживает этот метод, мы увидим, что экземпляр объекта Number возвращается.

Array.prototype.fill.call(123); 

Эта линия обеспечит тот же результат из полипол.

+0

Я понял! Я почти использую строгий режим, поэтому я сомневаюсь в его цели. Большое спасибо! –

1

Конструктор объектов возвращает свой аргумент, когда аргумент уже является объектом. Если это не объект, он возвращает «объектизированную» версию аргумента: экземпляр String, если это строка, экземпляр Number, если это число и т. Д.

Эта функция немного странная, и в ней в частности, значение this будет обычно быть объектом в любом случае. У есть, но вы должны уйти от своего пути, чтобы добраться до внутренних полигонов с помощью значения this, которое не является объектом.

+1

Возможно, стоит отметить, что 'this' всегда является объектом в нестрогом режиме , но может быть примитивным в строгом режиме. –

+0

@FelixKling да хорошая точка. Я пытаюсь понять, что этот код пытается сделать; в частности, я не вижу смысла этих сдвигов вправо на 0. Ничто не проверяет, существует ли '.length', поэтому, если функция применяется к неправильному типу объекта, это будет неуспешно. Но да, что вы предлагаете, верно. – Pointy

+0

Я думаю, он просто пытается быть очень близок к спецификации. –