Detaillierte Erklärung der obligatorischen und impliziten Konvertierung von Typen in JavaScript

Detaillierte Erklärung der obligatorischen und impliziten Konvertierung von Typen in JavaScript

1. Implizite Konvertierung

Was ist das Ergebnis der Ausführung der folgenden Anweisung?

A. undefined == null
B. isNaN("100")
C. parseInt("1a") === 1
D. [ ] Instanz von Array

Antwort:

A. undefined == null ist wahr; undefined === null ist falsch

B. Wenn NaN oder ein Wert, der in NaN konvertiert werden kann, übergeben wird, gibt isNaN „true“ zurück. „100“ wird zuerst in „Number–>100“ konvertiert, was nicht NaN ist und daher „false“ zurückgibt.

C. parseInt("1a") analysiert nur den Teil, dem eine Zahl vorangestellt ist, d. h. es wird nur "1" analysiert, und parseInt("1a1") === 1 ist ebenfalls wahr

D. [ ] ist ein leeres Array, gibt true zurück

Konvertierung in doppeltes Gleichheitszeichen

Schauen wir uns nach dem Aufwärmen einen Codeabschnitt an:

Wenn ([]) {
  konsole.log(true);
}

Das Ergebnis stimmt.

Tatsächlich ist [] falsch, denn beim Vergleichen von Gleichheitszeichen werden, wenn auf einer Seite ein Boolescher Wert steht, die Daten auf beiden Seiten zuerst in eine Zahl umgewandelt.
Im Augenblick:

Zahl([]); // 0
Zahl (falsch); // 0

Daher ist [] falsch.

Bei der Eingabe einer if-Anweisung werden die Daten jedoch in den Booleschen Typ konvertiert.

Im Augenblick:

Boolean([]); // wahr

Es kann also „true“ ausgeben.

Fassen Sie einige Techniken zur Beurteilung doppelter Gleichheitszeichen zusammen:

  1. Wenn vor und nach dem doppelten Gleichheitszeichen NaN steht, wird immer „false“ zurückgegeben.
  2. Wenn vor und nach dem doppelten Gleichheitszeichen Boolesche Werte (einschließlich 0 und 1) stehen, werden diese vor dem Vergleich alle in Zahlen umgewandelt (false ist 0, true ist 1).
  3. Wenn vor und nach den doppelten Gleichheitszeichen Zeichenfolgen stehen, gibt es drei Fälle:
    1. Wenn das andere Ende ein Objekt ist, wird das Objekt mit toString oder ValueOf konvertiert.
    2. Das andere Ende ist eine Zahl, eine Zeichenfolge zu einer Zahl;
    3. Das andere Ende ist eine Zeichenfolge, die direkt verglichen wird;
    4. Alle anderen geben false zurück.
  4. Wenn ein Ende eine Zahl und das andere Ende eine Zeichenfolge wie „3“ ist, beziehen Sie sich auf das dritte Element. Das andere Ende ist ein Objekt, und das toString- oder ValueOf-Ergebnis des Objekts wird für den Vergleich verwendet, andernfalls wird false zurückgegeben.
  5. null und undefined werden nicht typkonvertiert, sind aber gleich;

Boolesche Typkonvertierung

var test = neuer Boolean();
Konsole.log(Test);

var test = neuer Boolean(0);
Konsole.log(test.valueOf());

var test = neuer Boolean(null);
Konsole.log(test.valueOf());

var test = neuer Boolean("");
Konsole.log(test.valueOf());

var test = neuer Boolean(NaN);
Konsole.log(test.valueOf());

Die Antwort ist:

falsch falsch falsch falsch falsch

Und so funktioniert es:

  1. Wenn Boolean() als Konstruktor (mit Operator new) aufgerufen wird, konvertiert es sein Argument in einen Boolean-Wert und gibt ein Boolean-Objekt zurück, das diesen Wert enthält. Beachten Sie, dass das zurückgegebene Objekt ein Boolean-Objekt ist, auf das über toString oder valueOf zugegriffen werden kann.
  2. Wenn Boolean() als Funktion (ohne Operator „new“) aufgerufen wird, konvertiert es sein Argument einfach in einen primitiven Booleschen Wert und gibt diesen Wert zurück – eine erzwungene Typkonvertierung.
  3. Wenn der Wertparameter weggelassen oder auf 0, -0, null, "", false, undefiniert oder NaN gesetzt ist, wird das Objekt auf false gesetzt. Andernfalls wird es auf „true“ gesetzt (auch wenn der Wertparameter die Zeichenfolge „false“ ist).

"+" und "-"

konsole.log(1 + "2" + "2");
konsole.log(1 + +"2" + "2");
console.log("A" - "B" + "2");
console.log("A" - "B" + 2);

Was ist die Ausgabe?

Das Ergebnis ist: 122 32 NaN2 NaN

Analyse:

  1. Durch das Addieren einer Zahl und einer Zeichenfolge wird die Zahl in eine Zeichenfolge umgewandelt, das Ergebnis ist also eine Zeichenfolgenverkettung. Der erste Satz gibt „122“ aus;
  2. +"2", der unäre Operator + wandelt hier die Zeichenfolge in eine Zahl um, also 1+ +"2" = 1+2 = 3, und führt sie dann mit der folgenden Zeichenfolge zusammen, sodass der zweite Satz "32" ausgibt;
  3. Das Minuszeichen wandelt zuerst beide Seiten des Minuszeichens in Zahlen um, und die Ergebnisse von Zahl("A") und Zahl("B") sind NaN. Bei der Subtraktionsoperation ist das Ergebnis NaN, solange eine Seite NaN ist. Daher ist der dritte Satz die Verkettung von NaN und "2", und das Ergebnis ist NaN2 (wie in Punkt 4.1 erwähnt, ist das Ergebnis falsch, wenn eine Seite des doppelten Gleichheitszeichens NaN ist);
  4. Nach der Analyse des vorherigen Satzes ist das Ergebnis von "A" - "B" NaN, und wenn es zur Zahl 2 addiert wird, ist das Ergebnis immer noch NaN

2. Erzwungene Typkonvertierung

Welche der folgenden Codes sind für den Code var a = 10,42; zum Extrahieren des ganzzahligen Teils von a korrekt?

A. parseInt( a );
B. Math.floor( a );
C. Math.ceil( a );
D. a.split('.')[0];

Antwort: AB

Viele Menschen entscheiden sich auf den ersten Blick für ABC.

Analyse:

A. parseInt konvertiert in eine Ganzzahl, der Standardwert ist Dezimalzahl und das Ergebnis ist 10;

B. floor wird abgerundet, das Ergebnis ist 10 – floor bedeutet floor, abgerundet, als Hilfe zum Einprägen;

C. ceil wird aufgerundet und das Ergebnis ist 11;

D. Der Split-Operand muss ein regulärer Ausdruck oder eine Zeichenfolge sein, andernfalls wird TypeError ausgelöst.

neuer String mit ''

Welche der folgenden Aussagen sind wahr?

A. 'foo' == neue Funktion () { return String('foo'); };
B. 'foo' == neue Funktion() { return neuer String('foo'); };
C. [] == 0
D. ![]
E: !0

Antwort:

A: Lassen Sie es mich unten im Detail erklären;

B: Lassen Sie mich das im Detail erklären.
C: Das Ergebnis von Number([]) ist 0, also ist Option C richtig;
D: Das Objekt ist immer gleich wahr, aber warum ist das Ergebnis der Beurteilung eines leeren Objekts == wahr oder === wahr immer falsch?

Gemäß unserer Zusammenfassung des doppelten Gleichheitszeichens werden beide Seiten in den Zahlentyp konvertiert, wenn eine Seite des doppelten Gleichheitszeichens ein Boolescher Wert ist. Wenn die Konsole also „leeres Objekt == true“ oder „=== true“ testet, führt sie tatsächlich „leeres Objekt == 1“ oder „=== 1“ aus und gibt daher „false“ zurück. Wenn Sie also überprüfen möchten, ob das Objekt immer „true“ ist, sollten Sie !{} und !!{} !{}; // false; !!{}; // true verwenden.

E: Da Boolean(0) == false, !0 = true, was richtig ist.

Sprechen wir über Option AB. Aufgrund der Verwendung des Schlüsselworts new und des Aufrufs des Funktionskonstruktors ist das Ergebnis unerwartet.

Zunächst müssen wir wissen, dass beim Aufruf eines Konstruktors mit „new“ das von „new“ erstellte anonyme Objekt überschrieben wird, wenn intern ein Referenzobjekt (Array, Objekt, Funktion usw.) zurückgegeben wird.

Wenn ein primitiver Typ zurückgegeben wird (wenn keine explizite Rückgabe erfolgt, wird tatsächlich „undefined“ zurückgegeben), wird das von „new“ erstellte anonyme Objekt zurückgegeben.

Es scheint, dass

Bei Option A gibt der Konstruktor eine Zeichenfolge zurück, sodass der endgültige Konstruktor ein von „new“ erstelltes anonymes Objekt zurückgibt, das ein leeres Objekt ist.

Bei Option B wird innerhalb des Konstruktors ein Zeichenfolgenobjekt zurückgegeben, sodass der endgültige Konstruktor dieses Objekt zurückgibt.

Zusammenfassen

Dies ist das Ende dieses Artikels über obligatorische und implizite Typkonvertierungen in JavaScript. Weitere Informationen zu obligatorischen und impliziten Typkonvertierungen in JavaScript finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • JavaScript-Datenvisualisierung: ECharts-Kartenerstellung
  • Super detaillierte grundlegende JavaScript-Syntaxregeln
  • JavaScript implementiert das Ändern der Farbe einer Webseite über einen Schieberegler
  • Detaillierte Erklärung der Unterschiede zwischen var, let und const in JavaScript es6
  • Detaillierte Erklärung des this-Zeigeproblems in JavaScript
  • Fallstudie zu JavaScript-Funktionsaufrufen, Apply- und Bind-Methoden
  • Detaillierte Erklärung zur Verwendung des Arguments-Objekts in JavaScript
  • Beispiel für die JavaScript-Funktion „CollectGarbage“
  • Detaillierte Erklärung von BOM und DOM in JavaScript
  • Erläuterung der Anwendungsfälle von JavaScript setTimeout und setTimeinterval
  • JavaScript-Timer zur Realisierung einer zeitlich begrenzten Flash-Sale-Funktion
  • JavaScript zum Implementieren einer zeitlich begrenzten Flash-Sale-Funktion
  • JavaScript-Objekte (Details)

<<:  Detaillierte Erklärung zum Anzeigen und Einstellen des SQL-Modus in MySQL

>>:  So installieren Sie OpenSSH aus dem Quellcode in CentOS 7

Artikel empfehlen

Standardmäßige Stilanordnung für HTML-Tags

html, address,blockquote,body, dd, div,dl, dt, fie...

Konfigurationsschritte für die MySQL-Gruppenreplikation (empfohlen)

MySQL-Group-Replication ist eine neue Funktion, d...

Durch das flexible Layout können Unterelemente ihre eigene Höhe beibehalten

Beim Verwenden des Flex-Layouts werden Sie festst...

So erkennen Sie mit Apache Tika, ob eine Datei beschädigt ist

Apache Tika ist eine Bibliothek zur Dateityperken...

Detaillierte Erklärung der 10 häufigsten HTTP-Statuscodes

Der HTTP-Statuscode ist ein dreistelliger Code, d...

Methode zur Verhinderung von SSH-Cracking auf Linux-Servern (empfohlen)

1. Der Linux-Server konfiguriert /etc/hosts.deny ...

Zusammenfassung gängiger Begriffe in CSS (Cascading Style Sheet)

Wenn Sie CSS verwenden, vergessen Sie nicht, DOCTY...

JavaScript Canvas realisiert den Effekt des Neun-Quadrat-Rasterschneidens

In diesem Artikel wird der spezifische Code der L...

So verwenden Sie rsync unter Linux

Inhaltsverzeichnis 1. Einleitung 2. Installation ...

Integrierte Objekte, Werttypen und Referenztypen in JavaScript-Objekten erklärt

Inhaltsverzeichnis Objekt Objektdefinition Iterie...

Ändern Sie den Stil des HTML-Textkörpers in JS

Inhaltsverzeichnis 1. Ursprüngliche Definition 2....