Grundlagen
Sie wissen es vielleicht nicht, aber wenn wir in JavaScript mit Zeichenfolgen, Zahlen oder booleschen Grundelementen interagieren, betreten wir eine verborgene Welt von Objektschatten und Zwang.
Zeichenfolge, Zahl, Boolescher Wert, Null, undefiniert und Symbol.
In JavaScript gibt es 7 Urtyp: undefined, null, boolean, string, number, bigintund symbol. Alles andere ist ein Objekt. Die primitiven Typen boolean, stringund numberkönnen durch ihr Objekt Pendants gewickelt werden. Diese Objekte sind Instanzen von der Boolean, Stringund NumberKonstrukteure sind.
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
Wenn Grundelemente keine Eigenschaften haben, warum wird "this is a string".lengthein Wert zurückgegeben?
Weil JavaScript leicht zwischen Grundelementen und Objekten zwingt. In diesem Fall wird der Zeichenfolgenwert zu einem Zeichenfolgenobjekt gezwungen, um auf die Eigenschaftslänge zuzugreifen. Das String-Objekt wird nur für den Bruchteil einer Sekunde verwendet, danach wird es den Göttern der Müllabfuhr geopfert - aber im Geiste der TV-Entdeckungsshows werden wir die schwer fassbare Kreatur fangen und für weitere Analysen aufbewahren ...
Um dies weiter zu demonstrieren, betrachten Sie das folgende Beispiel, in dem wir dem String-Konstruktor-Prototyp eine neue Eigenschaft hinzufügen.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
Auf diese Weise haben Grundelemente Zugriff auf alle Eigenschaften (einschließlich Methoden), die von ihren jeweiligen Objektkonstruktoren definiert wurden.
Wir haben also gesehen, dass primitive Typen bei Bedarf angemessen zu ihrem jeweiligen Objekt-Gegenstück gezwungen werden.
Analyse der toString()Methode
Betrachten Sie den folgenden Code
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
Wie oben erläutert, geschieht das, was wir tun, wenn wir eine toString()Methode für einen primitiven Typ aufrufen , sie in ihr Objektgegenstück gezwungen, bevor sie die Methode aufrufen kann.
dh myNumber.toString()ist äquivalent Number.prototype.toString.call(myNumber)und ähnlich für andere primitive Typen.
Was aber, wenn anstelle der Übergabe des primitiven Typs an die toString()Methode des entsprechenden Gegenstücks zur Objektkonstruktorfunktion der primitive Typ als Parameter an die toString()Methode des Objektfunktionskonstruktors ( Object.prototype.toString.call(x)) übergeben wird?
Schauen Sie sich Object.prototype.toString () genauer an
Gemäß der Dokumentation werden beim Aufrufen der toString-Methode die folgenden Schritte ausgeführt:
- Wenn der
thisWert ist undefined, geben Sie zurück "[object Undefined]".
- Wenn der
thisWert ist null, geben Sie zurück "[object Null]".
- Wenn dieser Wert keiner der oben genannten Werte ist, sei
Odas Ergebnis des Aufrufs toObject, den thisWert als Argument zu übergeben.
- Klasse sei der Wert der
[[Class]]internen Eigenschaft von O.
- Gibt den String - Wert, der das Ergebnis der Verkettung der drei Strings ist
"[object ", classund "]".
Verstehen Sie dies anhand des folgenden Beispiels
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
Referenzen:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 / das geheime Leben von Javascript-Primitiven /