Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion darüber, warum Strings in JavaScript über Methoden_Javascript-Fähigkeiten verfügen

Eine kurze Diskussion darüber, warum Strings in JavaScript über Methoden_Javascript-Fähigkeiten verfügen

WBOY
WBOYOriginal
2016-05-16 15:41:591125Durchsuche

Einführung

Wir alle wissen, dass JavaScript-Datentypen in zwei Kategorien unterteilt sind: Basistypen (oder primitive Typen) und Referenztypen.

Grundtypwerte sind einfache Datensegmente, die im Stapelspeicher gespeichert sind und auf die über den Wert zugegriffen wird. In JS gibt es fünf Grundtypen: Undefiniert, Null, Boolean, Zahl und String.

Der Wert des Referenztyps ist ein im Heapspeicher gespeichertes Objekt, auf dessen Wert per Referenz zugegriffen wird. Zu den Referenztypen gehören hauptsächlich Objekt, Array, Funktion, RegExp und Datum.

Objekte haben Eigenschaften und Methoden, daher ist es überhaupt nicht überraschend, dass wir den folgenden Code sehen.

var favs=['鸡蛋','莲蓬'];
favs.push('秋葵');
console.log(favs);//["鸡蛋", "莲蓬", "秋葵"]
console.log(favs.length);//3

Array ist ein Referenztyp, daher kann es natürlich Eigenschaften (Länge) und Methoden (Push) haben. Dies ist so natürlich wie das Essen von Eis im Sommer. Schauen Sie sich jedoch den folgenden Code an und überlegen Sie sorgfältig: Ist dies und das legal?

var realMessage="Said I love you but I lied";
var myMessage=realMessage.substring(5,15);
console.log(myMessage); //"I love you"

Es gab ein Mädchen mit gebrochenem Herzen, das absichtlich die „Teilstring“-Methode an einem String ausführte, der zum Aufbrechen verwendet wurde, und dann glücklich einschlief, als es sich die bearbeitete Version ansah. Aber, aber heißt es nicht, dass String ein Basistyp ist? Warum kann er Methoden haben? ? Gibt es eine königliche Methode, Lord Qingtian?

Eigentlich ist das alles auf etwas zurückzuführen, das „Basic Packaging Type“ genannt wird. Diese einfache Verpackungsart ist besonders aufrecht und stellt das wahre „Erledigen und Gehen, Verstecken der Vorzüge und des Ruhms“ dar!

Grundlegende Verpackungsarten

Zusätzlich zu den eingangs erwähnten Objekt-, Array- und anderen Referenztypen stellt uns JavaScript auch drei spezielle Referenztypen zur Verfügung: String, Number und Boolean, die uns die Bedienung der entsprechenden Grundtypen erleichtern.

Wenn Sie sich weiterhin das obige Beispiel zum Ausschneiden einer Zeichenfolge ansehen, ist Ihnen aufgefallen, dass sich der Wert von realMessage selbst trotz Verwendung der Teilzeichenfolgenmethode nicht ändert. Der Aufruf dieser Methode gibt lediglich eine neue Zeichenfolge zurück.

Dies ist es, was der Basisverpackungstyp bewirkt. Ursprünglich haben Sie keine Methode, aber wenn Sie eine Methode verwenden möchten, passen Sie sie einfach an. Der entsprechende Basisverpackungstyp verfügt über diese Methode. Beispielsweise ist es für die obige Teilzeichenfolgenmethode nicht möglich, dass der Basistyp „String“ über diese Methode verfügt, der Verpackungstyp „String“ jedoch schon, und er führt die Methode aus und gibt das Ergebnis zurück. Bei der Ausführung zu:

realMessage.substring(5,15)

Mit dieser Codezeile passiert viel.

Zuerst wird der Wert von realMessage aus dem Speicher gelesen. In diesem Lesemodus beginnt der Hintergrund zu funktionieren. JS Elevation beschreibt diese im Hintergrund ausgeführten Aktionen wie folgt:

1. Erstellen Sie eine Instanz vom Typ String; 2. Rufen Sie die angegebene Methode für die Instanz auf 3. Zerstöre diese Instanz

Das obige Beispiel kann mit Code wie diesem veranschaulicht werden:

var _realMessage=new String("Said I love you but I lied");
var myMessage=_realMessage.substring(5,15);
_realMessgae=null; //方法调用后即销毁
Wir verstehen also, dass es nicht der Basistyp-String ist, der seine eigene Methode ausführt, sondern der Hintergrund einen entsprechenden Basis-Pakettyp-String dafür erstellt, der eine Instanz basierend auf dem Wert des Basistyps instanziiert, sodass This Die Instanz ruft die angegebene Methode auf und zerstört sich schließlich selbst, was erstaunlich ist.

Achten Sie im letzten Schritt auf die Funktion „Zerstörbar“ des Basisverpackungstyps, die festlegt, dass wir keine benutzerdefinierten Eigenschaften und Methoden zu Basistypwerten hinzufügen können.

var me="sunjing";
me.age=18;
console.log(me.age);//undefined
Ich habe der Zeichenfolge „me“ das Altersattribut hinzugefügt und den Wert auf wunderbare 18 Jahre gesetzt. Als ich es jedoch erneut besuchte, war von diesem Attribut keine Spur mehr. Das liegt daran:

Wenn die Attributzuweisung in der zweiten Codezeile ausgeführt wird, wird im Hintergrund eine Instanz des Basisverpackungstyps erstellt. Das Altersattribut wird zwar an die Instanz angehängt, aber dann wird die Instanz zerstört. Wenn die dritte Ausführungszeile ausgeführt wird, wird eine neue Instanz des Basisverpackungstyps neu erstellt, die natürlich kein Altersattribut aufweist.

Anzeige anhand des Basisverpackungstyps


Zusätzlich dazu, wenn sich die Zeichenfolge im Lesemodus befindet, hilft uns der Hintergrund beim Erstellen grundlegender Verpackungstypinstanzen, und wir können sie auch explizit selbst erstellen.

var str=new String("hello");
var str2=str.toUpperCase();
console.log(str2);//"HELLO:
Dies unterscheidet sich von dem, was in der Variablen gespeichert wird, wenn der Hintergrund uns bei der Erstellung hilft.

var str1=new String("hello");
var str2="hello";
typeof str1 //"object"
typeof str2 //"string"
Zusammenfassung


Dank der grundlegenden Verpackungstypen ist es für uns bequemer, die drei Grundtypen Zeichenfolge, Boolescher Wert und Zahl zu bedienen. Immer wenn diese drei Grundtypen von Werten gelesen werden, wird im Hintergrund die entsprechende Verpackungstypinstanz erstellt. Diese Instanz ruft die angegebene Methode auf und wird nach dem Aufruf zerstört. Aufgrund dieses kurzen Lebenszyklus können wir Basistypen keine benutzerdefinierten Eigenschaften und Methoden hinzufügen.

Werfen wir einen Blick auf die subString()-Methode und die Slice()-Methode der String-Klasse in JavaScript

Kürzlich habe ich das Buch „Advanced Programming with Javascript“ gelesen und einige praktische Fähigkeiten und Wissenspunkte gefunden, auf die ich noch nie zuvor gestoßen war. Ich wollte sie in meinem Blog festhalten, um mein Gedächtnis zu vertiefen.

In Abschnitt 2.8.4 des Buches haben wir über die subString()-Methode und die Slice()-Methode in der String-Klasse gesprochen. Ihre Verwendung und Rückgabeergebnisse sind im Wesentlichen gleich, wie im folgenden Beispiel gezeigt:

由以上代码的输出结果可已看出,slice()方法和subString()方调用方法法和输出结果完全一样,这两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数,第一个参数是要获取的子串的起始位置,第二个参数是要获取子串的终止位置,如果第二个参数省略终止位置就默认为字符串的长度,且两个方法都不改变String对象自身的值。

为什么有两个功能完全相同的方法呢?事实上,这两个方法并不完全相同,不过只在参数为负值时,他们处理参数的方式稍有不同。

对于负数参数,slice()方法会用字符串的长度加上参数,subString()方法将其作为0处理,例如:

var strObj = new String("hello world");
alert(strObj.slice(-3));      // 输出结果:"rld"
alert(strObj.subString(-3));    // 输出结果:"hello world"
alert(strObj.slice(3,-4));     // 输出结果:"lo w"
alert(strObj.subString(3,-4))   // 输出结果:"hel"

这样既可看到slice()和subString()方法的主要不同。当只有参数-3时,slice()返回"rld",subString()则返回"hello world"。这是因为对于字符串"hello world",slice(-3)将被转换成slice(8),而subString(-3)则转化成subString(0)。同样,使用3和-4差别也是很明显。slice()方法将被转换成slice(3,7),与前面的例子相同,返回"lo w"。而subString()方法则将这个两个参数解释为subString(0,3),实际上是:subString(0,3),因为subString()总是把较小的参数作为起始位,较大的数字最为终止位。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn