2016-08-25 2 views
5

In https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fillich keine Ahnung Objekt haben (dies) bedeutet

es eine Zeile wie

// 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; 

und ich kann keine Notwendigkeit finden O als Object (dieser) zuzuordnen.

Wird es nur zur besseren Lesbarkeit geschrieben oder gibt es einen bestimmten Grund für die Zuweisung?

+1

Nun, es folgt nur die Schritte des Algorithmus in der Spezifikation. Und dort heißt es: 'Lass O sein? ToObject (dieser Wert) .' http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.fill –

Antwort

3

Wie in den Kommentaren zum Code empfohlen, wird in diesem Abschnitt die ersten Schritte, die in the spec dokumentiert sind, korrekt pollyfill.

  1. Let O ToObject (dieser Wert) sein.
  2. ReturnIfAbrupt (O).

Obwohl ein bisschen out-of-order, ist dies die fucntion von ToObject(this value) Durchführung:

var O = Object(this); 

Grundsätzlich, wenn es auf einem Nicht-Objekt aufgerufen wird, soll das nicht-Objekt sein zu einem Object geworfen.

Zum Beispiel, wenn wir dieses Bit des meist unsinnigen Codes in einer JavaScript-Engine ausführen würden, die diese Methode nativ unterstützt, würden wir sehen, dass eine Number Objektinstanz zurückgegeben wird.

Array.prototype.fill.call(123); 

Diese Linie würde das gleiche Ergebnis vom Polyfill sicherstellen.

+0

Ich habe es! Ich benutze fast strikt Modus, also bezweifle ich seinen Zweck. Vielen Dank! –

1

Der Objektkonstruktor gibt sein Argument zurück, wenn das Argument bereits ein Objekt ist. Wenn es kein Objekt ist, gibt es die "vergegenständlichte" Version des Arguments zurück: eine String-Instanz, wenn es eine Zeichenfolge ist, eine Zahleninstanz, wenn es eine Zahl ist usw.

Die fragliche Funktion ist ein wenig seltsam, und in insbesondere der Wert this wird in der Regel ein Objekt sein. Es ist nicht zu haben, aber Sie müssen irgendwie aus dem Weg zu den Innereien des Polyfill mit einem this Wert, der kein Objekt ist zu gehen.

+1

Vielleicht ist es bemerkenswert, dass 'dies' immer ein Objekt im nicht-strikten Modus ist , kann aber im strikten Modus ein Primitiv sein. –

+0

@FelixKling ja guter Punkt. Ich versuche herauszufinden, was dieser Code versucht zu tun; insbesondere sehe ich den Punkt dieser Rechtsverschiebung nicht durch 0. Nichts überprüft, ob ".length" da ist. Wenn die Funktion also auf den falschen Objekttyp angewendet wird, wird sie auf ziemlich ungeschickte Weise fehlschlagen. Aber ja, was Sie vorschlagen, ist wahr. – Pointy

+0

Ich denke, es versucht nur, der Spezifikation sehr nahe zu kommen. –

Verwandte Themen