Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion zur impliziten Typkonvertierung in JavaScript

Eine kurze Diskussion zur impliziten Typkonvertierung in JavaScript

黄舟
黄舟Original
2017-03-15 14:53:241423Durchsuche

Der

-Datentyp von JavaScript ist in sechs Typen unterteilt, nämlich null, undefiniert, boolesch, Zeichenfolge, Zahl, Objekt. Objekt ist ein Referenztyp und die anderen fünf Typen von sind Basistypen oder primitive Typen. Mit der Methode typeof können wir ausdrucken, zu welchem ​​Typ etwas gehört. Um Variablen verschiedener Typen zu vergleichen, müssen Sie zuerst den Typ konvertieren, was als Typkonvertierung bezeichnet wird. Implizite Konvertierungen erfolgen normalerweise mit den -Operatoren Addition, Subtraktion, Multiplikation, Division, Gleichheit und Kleiner als, Größer als usw. .

typeof '11'  //string       
typeof(11)  //number
&#39;11&#39; < 4     //false

Konvertierung von Grundtypen

Lass uns zuerst über Addition, Subtraktion, Multiplikation und Division sprechen:

1.StringsZahlen hinzufügen, die Zahl wird in eine Zeichenfolge umgewandelt.

2. Subtrahiere die Zeichenfolge von der Zahl und wandele die Zeichenfolge in eine Zahl um. Wenn die Zeichenfolge keine reine Zahl ist, wird sie in NaN konvertiert. Das Gleiche gilt für Zeichenfolgen minus Zahlen. Durch die Subtraktion zweier Zeichenfolgen werden diese ebenfalls zunächst in Zahlen umgewandelt.

3. Das Gleiche gilt für Umrechnungen von Multiplikation, Division, Größer als, Kleiner als und Subtraktion.

//隐式转换 + - * == / 
// + 
10 + &#39;20&#39;    //2010
// -
10 - &#39;20&#39;    //-10
10 - &#39;one&#39;   //NaN
10 - &#39;100a&#39;  //NaN
// *
10*&#39;20&#39;      //200
&#39;10&#39;*&#39;20&#39;    //200
// /
20/&#39;10&#39;      //2
&#39;20&#39;/&#39;10&#39;    //2
&#39;20&#39;/&#39;one&#39;  //NaN

Werfen wir einen Blick auf einen anderen Satz von ==.

1. undefiniert ist gleich null

Wenn Sie Zeichenfolgen und Zahlen vergleichen, konvertieren Sie Zeichenfolgen in Zahlen

Konvertieren Sie beim Vergleich von Zahlen einen Booleschen Wert

4. Konvertieren Sie beim Vergleich von Zeichenfolgen und Booleschen Werten die beiden in Zahlen

// ==
undefined == null;    //true
&#39;0&#39; == 0;            //true,字符串转数字
0 == false;           //true,布尔转数字
&#39;0&#39; == false;       //true,两者转数字
null == false;       //false
undefined == false;  //false

Konvertierung von Referenztypen

Der Vergleich zwischen Grundtypen ist relativ einfach . Der Vergleich zwischen Referenztypen und Basistypen ist relativ kompliziert. Zunächst muss der Referenztyp in einen Basistyp umgewandelt und dann gemäß der oben genannten Methode verglichen werden. In Boolean konvertierte Referenztypen sind alle wahr. Beispielsweise ist ein leeres Array, solange es ein Objekt ist, ein Referenztyp, also ist [] wahr. Um einen Referenztyp in eine Zahl oder einen String umzuwandeln, verwenden Sie valueOf() oder toString(); das Objekt selbst erbt valuOf() und toString(), und Sie können auch valueOf() und toString( ). Verwenden Sie je nach Objekt den geerbten valueOf(), um es in einen String, eine Zahl oder sich selbst zu konvertieren, und das Objekt muss mit toString in einen String konvertiert werden. Allgemeine Objekte rufen standardmäßig valueOf() auf.

1. Wenn Sie ein Objekt in eine Zahl konvertieren, rufen Sie valueOf(); auf.

2. Wenn Sie ein Objekt in eine Zeichenfolge konvertieren, rufen Sie toString(); auf.

Erster Blick im folgenden Beispiel:

0 == [];        // true, 0 == [].valueOf(); -> 0 == 0;
&#39;0&#39; == [];      // false, &#39;0&#39; == [].toString(); -> &#39;0&#39; == &#39;&#39;;
2 == [&#39;2&#39;];     // true, 2 == [&#39;2&#39;].valueOf(); -> 2 == &#39;2&#39; -> 2 == 2;
&#39;2&#39; == [2];     // true, &#39;2&#39; == [2].toString(); -> &#39;2&#39; ==&#39;2&#39;;

[] == ![];      //true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0;

Wenn das Objekt in eine Zahl umgewandelt wird, wird valueOf() aufgerufen. Davor wird toString() aufgerufen, also ist die valueOf-Methode vermutlich so. Daher sollte das obige Beispiel 0 == [] in das folgende geändert werden, was sinnvoller ist. In jedem Fall wird [] schließlich in 0 umgewandelt.

var valueOf = function (){
    var str = this.toString();    //先调用toString(),转成字符串
    //...
}
0 == [];        // true, 0 == [].valueOf(); -> 0 == &#39;0&#39; -> 0 == 0;

Benutzerdefinierte valueOf() und toString();

1. Benutzerdefinierte valueOf() und toString() sind beide vorhanden und valueOf() wird standardmäßig aufgerufen;

2. Wenn nur toString() vorhanden ist, rufen Sie toString(); auf.

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return &#39;1&#39;;}

a + 1;         // 2, valueOf()先调用

Das Entfernen von valueOf() führt zum Aufruf von toString().

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return &#39;1&#39;;}

a + 1;         // 2, 先调用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1;        // &#39;11&#39;, 调用toString()

Was passiert, wenn Sie etwas anderes zurückgeben?

var a = [1];

a.valueOf = function (){return ;}
a.toString = function (){return 1 ;};

1 - a;        //NaN

Andere Objekte rufen valueOf() auf, um in verschiedene Typen zu konvertieren:

var a = {};
a.valueOf();    //Object {}
var a = [];
a.valueOf();    //[]    自己本身
var a = new Date();
a.valueOf();    //1423812036234  数字
var a = new RegExp();
a.valueOf();    //    /(?:)/  正则对象

Der Vergleich zwischen Referenztypen ist der Vergleich von Speicheradressen, und hier ist keine implizite Konvertierung erforderlich Nicht viel zu sagen.

[] == []  //false 地址不一样

var a = [];
b = a;
b == a   //true

Explizite Konvertierung

Die explizite Konvertierung ist relativ einfach. Sie können die Klasse direkt als Methode zur direkten Konvertierung verwenden.

Number([]);        //0
String([]);        //&#39;&#39;
Boolean([]);       //true

Es gibt eine einfachere Konvertierungsmethode.

3 + &#39;&#39;    // 字符串&#39;3&#39;
+&#39;3&#39;      // 数字3
!!&#39;3&#39;     // true

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zur impliziten Typkonvertierung in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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