Heim > Web-Frontend > js-Tutorial > Die seltsamen Teile von JavaScript entschlüsseln, die jeder Entwickler kennen sollte

Die seltsamen Teile von JavaScript entschlüsseln, die jeder Entwickler kennen sollte

Barbara Streisand
Freigeben: 2025-01-03 02:06:38
Original
448 Leute haben es durchsucht

Decoding the Weird Parts of JavaScript Every Developer Should Know

JavaScript, die Sprache, die wir lieben (oder gerne hassen), ist voller einzigartiger Verhaltensweisen und Macken, die sie sowohl mächtig als auch verwirrend machen. Während diese „seltsamen Teile“ Anfänger verwirren können, ist es wichtig, sie zu beherrschen, um ein kompetenter Entwickler zu werden. Lassen Sie uns in einige faszinierende JavaScript-Kuriositäten eintauchen, die jeder Entwickler kennen sollte.


1. Zwang: JavaScripts geheimer Magier

JavaScript versucht hilfreich zu sein, indem es Werte zwischen Typen konvertiert, aber diese „Hilfsbereitschaft“ kann zu überraschenden Ergebnissen führen.

Beispiel: Unerwartete Mathematik

console.log('5' - 3);  // 2
console.log('5' + 3);  // '53'
Nach dem Login kopieren
Nach dem Login kopieren
  • Subtraktion: JavaScript wandelt „5“ vor der Subtraktion in eine Zahl um.
  • Addition: Wenn eine Zeichenfolge beteiligt ist, verkettet JavaScript, anstatt etwas hinzuzufügen.

Warum es wichtig ist

  • Diese implizite Konvertierung (Typzwang) kann zu Fehlern führen, wenn Sie nicht vorsichtig sind.
  • Verwenden Sie immer explizite Konvertierungen mit Number(), String() oder Boolean(), um Überraschungen zu vermeiden.

2. Das Geheimnis davon

Das Verhalten in JavaScript ist oft verwirrend, da es sich abhängig davon ändert, wie eine Funktion aufgerufen wird.

Beispiel: Verschiedene Kontexte

function showThis() {
  console.log(this);
}

showThis();  // Window or undefined in strict mode

const obj = { method: showThis };
obj.method();  // obj

const boundFunc = showThis.bind(obj);
boundFunc();  // obj
Nach dem Login kopieren
Nach dem Login kopieren

Warum es wichtig ist

  • dies ist zum Zeitpunkt der Erklärung nicht festgelegt; es hängt von der Anrufstelle ab.
  • Pfeilfunktionen haben kein eigenes This, was sie perfekt für die Beibehaltung des lexikalischen Kontexts macht.

3. Die Ereignisschleife: Asynchrones JavaScript entmystifiziert

JavaScript ist Single-Threaded, kann aber asynchrone Aufgaben über die Ereignisschleife verarbeiten.

Beispiel: Was läuft zuerst?

console.log('Start');

setTimeout(() => console.log('Timeout'), 0);

Promise.resolve().then(() => console.log('Promise'));

console.log('End');
Nach dem Login kopieren
Nach dem Login kopieren

Ausgabe

Start
End
Promise
Timeout
Nach dem Login kopieren
Nach dem Login kopieren
  • Synchroner Code wird zuerst ausgeführt.
  • Promises (Mikrotasks) haben Vorrang vor setTimeout (Makrotasks).

Warum es wichtig ist

Das Verständnis der Ereignisschleife ist der Schlüssel zum Schreiben leistungsfähigen asynchronen Codes.


4. Abschluss: Die Funktion, die erinnert

Ein Abschluss liegt vor, wenn sich eine Funktion an ihren lexikalischen Gültigkeitsbereich „merkt“, selbst nachdem die äußere Funktion zurückgekehrt ist.

Beispiel: Private Variablen

function counter() {
  let count = 0;
  return function () {
    count++;
    console.log(count);
  };
}

const increment = counter();
increment();  // 1
increment();  // 2
Nach dem Login kopieren
Nach dem Login kopieren

Warum es wichtig ist

Abschlüsse ermöglichen es Ihnen, private Variablen zu erstellen und den Status über Funktionsaufrufe hinweg beizubehalten.


5. Prototypen: Das Rückgrat von JavaScript

JavaScript verwendet prototypbasierte Vererbung, was bedeutet, dass Objekte Eigenschaften und Methoden von anderen Objekten erben können.

Beispiel: Benutzerdefinierte Methoden

console.log('5' - 3);  // 2
console.log('5' + 3);  // '53'
Nach dem Login kopieren
Nach dem Login kopieren

Warum es wichtig ist

Prototypen ermöglichen Ihnen die effiziente gemeinsame Nutzung von Methoden zwischen Instanzen.


6. Gleichheitsprüfungen: == vs ===

JavaScript bietet sowohl lose Gleichheit (==) als auch strikte Gleichheit (===), und sie verhalten sich unterschiedlich.

Beispiel: Der seltsame Fall von Null und Undefiniert

function showThis() {
  console.log(this);
}

showThis();  // Window or undefined in strict mode

const obj = { method: showThis };
obj.method();  // obj

const boundFunc = showThis.bind(obj);
boundFunc();  // obj
Nach dem Login kopieren
Nach dem Login kopieren
  • == führt eine Typkonvertierung durch, sodass null ungefähr gleich undefiniert ist.
  • === prüft auf Typ- und Wertgleichheit.

Warum es wichtig ist

Verwenden Sie immer ===, es sei denn, Sie benötigen explizit eine Typkonvertierung.
Vermeiden Sie den direkten Vergleich nicht-primitiver Werte ({} !== {}).


7. Unveränderlichkeit und Referenztypen

JavaScript behandelt Objekte und Arrays als Referenztypen, was bedeutet, dass sich Änderungen an einer Referenz auf das Original auswirken.

Beispiel: Fallstricke kopieren

console.log('Start');

setTimeout(() => console.log('Timeout'), 0);

Promise.resolve().then(() => console.log('Promise'));

console.log('End');
Nach dem Login kopieren
Nach dem Login kopieren

Warum es wichtig ist

  • Verwenden Sie Object.assign() oder den Spread-Operator ({ ...original }), um flache Kopien zu erstellen.
  • Für tiefe Kopien sollten Sie Bibliotheken wie Lodash oder StructuredClone in Betracht ziehen.

8. NaN: Nicht so einfach, wie es scheint

NaN steht für „Not a Number“, aber sein Verhalten ist alles andere als einfach.

Beispiel: Vergleich von NaN

Start
End
Promise
Timeout
Nach dem Login kopieren
Nach dem Login kopieren

Warum es wichtig ist

Verwenden Sie Object.is, wenn Sie für Sonderfälle wie NaN eine strikte Äquivalenz benötigen.


9. Heben: Was wird zuerst deklariert?

Durch das Hochziehen werden Variablen- und Funktionsdeklarationen an die Spitze ihres Gültigkeitsbereichs verschoben.

Beispiel: Hebevariablen

function counter() {
  let count = 0;
  return function () {
    count++;
    console.log(count);
  };
}

const increment = counter();
increment();  // 1
increment();  // 2
Nach dem Login kopieren
Nach dem Login kopieren
  • var-Deklarationen werden angehoben, aber als undefiniert initialisiert.
  • Funktionsdeklarationen sind vollständig aktiviert.

Warum es wichtig ist

Verwenden Sie let und const, um Verwirrung beim Heben von Variablen zu vermeiden.


10. Seltsame Standardeinstellungen: Standardparameter

Standardparameter machen Funktionen flexibler, können sich jedoch seltsam verhalten, wenn sie mit undefiniert kombiniert werden.

Beispiel: Standardwerte und Argumente

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function () {
  console.log(`Hello, my name is ${this.name}`);
};

const alice = new Person('Alice');
alice.greet();  // Hello, my name is Alice
Nach dem Login kopieren

Warum es wichtig ist

Standardparameter werden nur angewendet, wenn das Argument undefiniert und nicht null ist.


Fazit: Umfassen Sie die Verrücktheit

Die Macken von JavaScript machen es sowohl frustrierend als auch unterhaltsam. Das Verständnis dieser Verhaltensweisen macht Sie nicht nur zu einem besseren Entwickler, sondern hilft Ihnen auch dabei, die Flexibilität und Designoptionen der Sprache zu schätzen.

Auf welche dieser Macken sind Sie gestoßen und wie sind Sie damit umgegangen? Teilen Sie Ihre Gedanken in den Kommentaren unten mit!

Das obige ist der detaillierte Inhalt vonDie seltsamen Teile von JavaScript entschlüsseln, die jeder Entwickler kennen sollte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage