9 Fragen in Vorstellungsgesprächen für JavaScript

Blog

9 Fragen in Vorstellungsgesprächen für JavaScript

9 JavaScript-Interview-Fragen - Umfassende, von der Community getriebene Liste wichtiger JavaScript-Interview-Fragen. Egal, ob Sie ein Kandidat oder ein Vorstellungsgespräch sind, diese Interviewfragen helfen Ihnen …

JavaScript gilt als eine großartige Sprache für Anfänger. Es liegt zum Teil an seiner weit verbreiteten Verwendung im Internet und zum Teil daran, dass einige seiner Funktionen es ermöglichen, weniger als perfekten Code zu schreiben, der noch läuft: Er ist nicht so streng wie viele andere Sprachen, egal ob Sie ein Semi verpasst haben -Doppelpunkt oder Sie möchten sich nicht um die Speicherverwaltung kümmern.

Wenn Sie jedoch für Interviews bereit sind, möchten Sie sicher sein, dass Sie die Besonderheiten der Sprache kennen, einschließlich einiger Dinge, die automatisch und „hinter den Kulissen“ durchgeführt werden.

In diesem Artikel behandeln wir einige gängige JavaScript-Interview-Fragen – sowie ein paar Curveballs! Natürlich ist jedes Vorstellungsgespräch anders, und Sie können gefragt werden oder auch nicht irgendein Fragen dieser Art. Aber je mehr Sie wissen, desto besser sind Sie vorbereitet.

TEIL I: FRAGEN ZUM CURVEBALL

Es wäre ziemlich schwierig, wenn eine der folgenden Fragen in einem Interview auftaucht. Dennoch sollten sich diese Fragen in der Vorbereitung als nützlich erweisen: Sie zeigen einige interessante Eigenheiten von JavaScript und zeigen einige der Entscheidungen auf, die bei der Entwicklung einer Programmiersprache überhaupt zu treffen sind.

Für weitere skurrile JavaScript-Funktionen empfehle ich, es auszuprobieren https://wtfjs.com .

1. Warum ist Math.max() kleiner als Math.min()?

Die Tatsache, dass |_+_| gibt false zurück Geräusche falsch, aber es macht wirklich viel Sinn.

Wenn keine Argumente angegeben werden, wird |_+_| gibt |_+_| . zurück und |_+_|rückgibt |_+_| . Dies ist einfach Teil der Spezifikation für die |_+_| und |_+_| Methoden, aber hinter der Wahl steckt eine gute Logik. Um zu verstehen, warum, werfen Sie einen Blick auf den folgenden Code:

Math.max() > Math.min()

Wenn |_+_| wurde als Standardargument von |_+_| . angesehen , dann jeden Ergebnis wäre |_+_| , was ziemlich nutzlos ist! Wenn dagegen das Standardargument |_+_| . ist , würde das Hinzufügen eines anderen Arguments diese Zahl zurückgeben – und das ist das Verhalten, das wir wollen.

So hosten Sie einen Discord-Bot rund um die Uhr

2. Warum gibt 0.1 + 0.2 === 0.3 false zurück?

Kurz gesagt, es hat damit zu tun, wie genau JavaScript Floats in Binärdateien speichern kann. Wenn Sie die folgenden Gleichungen in die Konsole von Google Chrome eingeben, erhalten Sie:

Math.min()

Es ist unwahrscheinlich, dass dies zu Problemen führt, wenn Sie einfache Gleichungen ausführen, ohne dass ein hohes Maß an Genauigkeit erforderlich ist. Aber es kann selbst bei einfachen Anwendungen Kopfschmerzen bereiten, wenn Sie auf Gleichheit testen müssen. Dafür gibt es einige Lösungen.

Fixpunkt

Wenn Sie beispielsweise die maximale Genauigkeit kennen, die Sie benötigen (z. B. wenn Sie mit Währungen zu tun haben), können Sie den Wert ganzzahlig speichern. Also statt |_+_| , könntest du |_+_| . speichern und führe dazu beliebige Gleichungen auf. Sie können das Ergebnis dann dem Endbenutzer mit einem Ausdruck wie |_+_| . anzeigen , die eine Zeichenfolge zurückgibt.

Binär codierte Dezimalstellen

Wenn Genauigkeit wirklich wichtig ist, können Sie auch das Format Binary Coded Decimals (BCD) verwenden, auf das Sie in JavaScript zugreifen können Verwenden dieser BCD-Bibliothek . Jeder Dezimalwert wird separat in einem einzigen Byte (8 Bit) gespeichert. Dies ist ineffizient, da ein Byte 16 separate Werte speichern kann und dieses System nur die Werte 0–9 verwendet. Wenn Präzision für Ihre Anwendung jedoch wichtig ist, kann sich der Kompromiss lohnen.

3. Warum ist 018 minus 017 gleich 3?

Die Tatsache, dass |_+_| gibt |_+_| . zurück ist das Ergebnis einer stillen Typkonvertierung. In diesem Fall sprechen wir von Oktalzahlen.

Eine kurze Einführung in die Oktalzahlen

Sie kennen wahrscheinlich die Verwendung von binären (Basis-2) und hexadezimalen (Basis-16) Zahlensystemen in der Informatik, aber auch oktale (Basis-8) haben einen herausragenden Platz in der Geschichte der Computer: in den späten 1950er Jahren und In den 1960er Jahren wurde es verwendet, um binäres abzukürzen, was die Materialkosten in sehr teuer herzustellenden Systemen senkte!

Die meisten Funktionen von Word wurden deaktiviert, da für dieses Produkt ein Update erforderlich ist

Hexadezimal kam kurz darauf:

Die IBM 360 [veröffentlicht 1965] hat den entscheidenden Schritt von oktal zu hexadezimal gemacht. Für diejenigen von uns, die an Oktal gewöhnt sind, waren wir schockiert über die Extravaganz! *** - *** Vaughan Pratt #### Oktalzahlen heute

Aber wofür ist Oktal in modernen Programmiersprachen nützlich? Octal hat für einige Anwendungsfälle einen Vorteil gegenüber Hexadezimal, da keine nicht numerischen Ziffern erforderlich sind (mit 0-7 statt 0-F).

Eine häufige Verwendung sind Dateiberechtigungen für Unix-Systeme, wo es genau acht Berechtigungsvarianten gibt:

infinity

Aus ähnlichen Gründen wird es auch für digitale Anzeigen verwendet.

Zurück zur Frage

In JavaScript ist das Präfix |_+_| wandelt jede Zahl in Oktal um. Allerdings |_+_| wird nicht oktal verwendet, und jede Zahl, die ein |_+_| . enthält wird stillschweigend in eine reguläre Dezimalzahl umgewandelt.

Daher |_+_| ist tatsächlich äquivalent zum dezimalen Ausdruck |_+_| , weil |_+_| ist oktal, aber |_+_| ist dezimal.

TEIL II: GEMEINSAME FRAGEN

In diesem Abschnitt sehen wir uns einige der häufigeren JavaScript-Interview-Fragen an. Dies sind die Dinge, die beim ersten Erlernen von JavaScript leicht übersehen werden, aber ihre Kenntnis kann sich als sehr nützlich erweisen, wenn es darum geht, den bestmöglichen Code zu schreiben.

4. Wie unterscheidet sich ein Funktionsausdruck von einer Funktionsdeklaration?

Eine Funktionsdeklaration verwendet das Schlüsselwort |_+_| , gefolgt vom Namen der Funktion. Im Gegensatz dazu beginnt ein Funktionsausdruck mit |_+_| , |_+_| oder |_+_| , gefolgt vom Namen der Funktion und dem Zuweisungsoperator |_+_| . Hier sind einige Beispiele:

Math.max()

Bei der Verwendung besteht der Hauptunterschied darin, dass Funktionsdeklarationen gehisst , Funktionsausdrücke hingegen nicht. Das bedeutet, dass Funktionsdeklarationen vom JavaScript-Interpreter an den Anfang ihres Gültigkeitsbereichs verschoben werden, sodass Sie eine Funktionsdeklaration definieren und an einer beliebigen Stelle in Ihrem Code aufrufen können. Im Gegensatz dazu können Sie einen Funktionsausdruck nur in linearer Folge aufrufen: Sie müssen ihn vor dem Aufruf definieren.

Es gibt eine Handvoll Gründe, warum viele Entwickler heute Funktionsausdrücke bevorzugen:

  • In erster Linie erzwingen Funktionsausdrücke eine vorhersehbarere, strukturiertere Codebasis. Natürlich ist auch eine strukturierte Codebasis mit Deklarationen möglich; es ist nur so, dass Sie mit Deklarationen einfacher mit unordentlichem Code davonkommen.
  • Zweitens können wir die ES6-Syntax für Funktionsausdrücke verwenden: Dies ist im Allgemeinen prägnanter und |_+_| und |_+_| bieten mehr Kontrolle darüber, ob eine Variable neu zugewiesen werden kann oder nicht, wie wir in der nächsten Frage sehen werden.

5. Was sind die Unterschiede zwischen var, let und const?

Ich kann mir vorstellen, dass dies seit der Veröffentlichung von ES6 eine ziemlich häufige Interviewfrage von Unternehmen war, die die modernere Syntax vollständig nutzen. |_+_|war das Schlüsselwort für die Variablendeklaration aus der allerersten Version von JavaScript. Seine Nachteile führen jedoch zur Einführung von zwei neuen Schlüsselwörtern in ES6: |_+_|und |_+_| .

Diese drei Schlüsselwörter haben unterschiedliche Herangehensweisen an die Zuweisung, das Heben und den Umfang – daher werden wir jedes einzelne separat behandeln.

Quickbooks der Windows-Fehler war die Datei vorhanden

i) Auftrag

Der grundlegendste Unterschied ist, dass |_+_| und |_+_| kann neu zugewiesen werden während |_+_| kann nicht. Das macht |_+_| die beste Wahl für Variablen, die nicht geändert werden müssen, und verhindert Fehler wie eine versehentliche Neuzuweisung. Beachten Sie, dass |_+_| erlaubt variable Mutation, was bedeutet, dass wenn es ein Array oder ein Objekt darstellt, diese kann Veränderung. Sie können die Variable selbst einfach nicht neu zuweisen.

Beide |_+_| und |_+_| neu zugewiesen werden, aber — wie die folgenden Punkte verdeutlichen sollen — |_+_| hat erhebliche Vorteile gegenüber |_+_| , was sie in den meisten, wenn nicht allen Fällen, in denen eine Variable geändert werden muss, zu einer besseren Wahl macht.

ii) Heben

Ähnlich dem Unterschied zwischen Funktionsdeklarationen und Ausdrücken (oben diskutiert) werden Variablen mit |_+_| . deklariert werden immer an den Anfang ihres jeweiligen Gültigkeitsbereichs gehoben, während Variablen mit |_+_| . deklariert werden und |_+_| hochgezogen werden, aber wenn Sie versuchen, auf sie zuzugreifen, bevor sie deklariert wurden, erhalten Sie einen Fehler 'zeitliche Totzone'. Dies ist ein nützliches Verhalten, da |_+_| können anfälliger für Fehler sein, z. B. versehentliches Neuzuordnen. Nehmen Sie das folgende Beispiel:

-infinity

Hier das Ergebnis von |_+_| und |_+_| sind wie wir es erwarten. Aber was wäre, wenn wir die zweite fallen lassen würden |_+_| ?

max()

Obwohl |_+_| . innerhalb einer Funktion definiert ist, hat die globale Variable überschrieben. Wir mussten das Schlüsselwort |_+_| . wiederholen um anzugeben, dass die zweite Variable |_+_| ist nur auf |_+_| . beschränkt .

iii) Geltungsbereich

Während |_+_| ist funktionsbezogen, |_+_| und |_+_| sind blockbezogen: Im Allgemeinen ist ein Block jeder Code in geschweiften Klammern |_+_| , einschließlich Funktionen, bedingten Anweisungen und Schleifen. Um den Unterschied zu veranschaulichen, sehen Sie sich den folgenden Code an:

min()

Innerhalb unseres Bedingungsblocks ist das global gültige |_+_| wurde neu definiert, aber das global gültige |_+_| und |_+_| nicht haben. Im Allgemeinen sorgt das Sicherstellen, dass lokale Zuweisungen lokal bleiben, für saubereren Code und weniger Fehler.

6. Was passiert, wenn Sie eine Variable ohne Schlüsselwort zuweisen?

Was ist, wenn Sie eine Variable definieren, ohne ein Schlüsselwort zu verwenden? Technisch gesehen, wenn |_+_|nicht bereits definiert wurde, dann |_+_| ist die Abkürzung für |_+_| . Ich habe das besprochen in ein aktueller Artikel zur Speicherverwaltung in JavaScript , da dies eine häufige Ursache für Speicherlecks ist.

Um diese Abkürzung vollständig zu vermeiden, können Sie den strikten Modus verwenden – eingeführt in ES5 – indem Sie |_+_| . schreiben am Anfang Ihres Dokuments oder einer bestimmten Funktion. Wenn Sie dann versuchen, eine Variable ohne Schlüsselwort zu deklarieren, erhalten Sie eine Fehlermeldung: |_+_| .

7. Was ist der Unterschied zwischen objektorientierter Programmierung (OOP) und funktionaler Programmierung (FP)?

JavaScript ist eine Multi-Paradigmen-Sprache, was bedeutet, dass sie mehrere verschiedene Programmierstile unterstützt, einschließlich ereignisgesteuerter, funktionaler und objektorientierter.

Es gibt viele verschiedene Programmierparadigmen, aber im modernen Computing sind zwei der beliebtesten Stile Functional Programming (FP) und Object-Oriented Programming (OOP) – und JavaScript kann beides.

Objekt orientierte Programmierung

OOP basiert auf dem Konzept der Objekte. Dies sind Datenstrukturen, die Datenfelder – in JavaScript als Eigenschaften bezeichnet – und Prozeduren – als Methoden bezeichnet – enthalten.

Einige der in JavaScript integrierten Objekte umfassen |_+_| (verwendet für Methoden wie |_+_| , |_+_| und |_+_| ), |_+_| (wird zum Parsen von JSON-Daten verwendet) und primitive Datentypen wie |_+_| , |_+_| , |_+_| und |_+_| .

Wann immer Sie sich auf eingebaute Methoden, Prototypen oder Klassen verlassen, verwenden Sie im Wesentlichen die objektorientierte Programmierung.

Funktionale Programmierung

FP basiert auf dem Konzept reiner Funktionen, die Shared State, veränderliche Daten und Nebeneffekte vermeiden. Dies mag wie viel Jargon erscheinen, aber wahrscheinlich haben Sie viele reine Funktionen in Ihrem Code geschrieben.

azur sdk für js

Bei gleichen Eingaben liefert eine reine Funktion immer die gleiche Ausgabe. Es hat keine Nebenwirkungen: Dies sind alles, was über die Rückgabe des Ergebnisses hinausgeht, wie das Protokollieren an der Konsole oder das Ändern einer externen Variablen.

Was den gemeinsamen Zustand betrifft, hier ist ein kurzes Beispiel dafür, wie der Zustand die Ausgabe einer Funktion ändern kann, selbst wenn die Eingabe dieselbe ist. Lassen Sie uns ein Szenario mit zwei Funktionen darstellen: eine zum Addieren einer Zahl mit 5 und eine zum Multiplizieren mit 5.

Math.min(1) // 1 Math.min(1, infinity) // 1 Math.min(1, -infinity) // -infinity

Wenn wir |_+_| . anrufen zuerst und |_+_| zweitens ist das Gesamtergebnis |_+_| . Aber wenn wir die Funktionen andersherum aufrufen und das Ergebnis protokollieren, erhalten wir etwas anderes: |_+_| .

Dies widerspricht dem Prinzip der funktionalen Programmierung, da das Ergebnis der Funktionen je nach Kontext unterschiedlich ist. Wir können den obigen Code neu schreiben, damit die Ergebnisse vorhersehbar sind:

-infinity

Der Wert von |_+_| bleibt |_+_| , und unabhängig vom Kontext |_+_| und |_+_| wird immer das gleiche Ergebnis liefern.

8. Was ist der Unterschied zwischen imperativer und deklarativer Programmierung?

Wir können uns den Unterschied zwischen OOP und FP auch im Hinblick auf den Unterschied zwischen imperativer und deklarativer Programmierung vorstellen.

Dies sind Oberbegriffe, die gemeinsame Merkmale mehrerer verschiedener Programmierparadigmen beschreiben. FP ist ein Beispiel für deklarative Programmierung, während OOP ein Beispiel für imperative Programmierung ist.

Im Grunde geht es bei der imperativen Programmierung um wie du machst etwas. Es beschreibt die Schritte auf die wesentlichste Weise und ist gekennzeichnet durch |_+_| und |_+_| Schleifen, |_+_| und |_+_| Aussagen und so weiter.

Math.min()

Im Gegensatz dazu befasst sich die deklarative Programmierung mit was zu tun, und es abstrahiert das *wie *, indem es sich auf Ausdrücke verlässt. Dies führt oft zu prägnanterem Code, aber im größeren Umfang kann es schwieriger werden, Fehler zu beheben, da er viel weniger transparent ist.

Hier ist ein deklarativer Ansatz zu unserem |_+_| Funktion, oben.

-infinity

9. Was ist Prototyp-basierte Vererbung?

Schließlich kommen wir zur prototypbasierten Vererbung. Es gibt mehrere verschiedene Stile der objektorientierten Programmierung, und der, den JavaScript verwendet, ist die prototypbasierte Vererbung. Das System ermöglicht wiederholtes Verhalten durch die Verwendung vorhandener Objekte, die als Prototypen dienen.

Auch wenn Ihnen die Idee von Prototypen neu ist, sind Sie mit eingebauten Methoden auf das Prototypensystem gestoßen. Zum Beispiel Funktionen zum Bearbeiten von Arrays wie |_+_| , |_+_| , |_+_| und so weiter sind alle Methoden der |_+_| Objekt. Tatsächlich erbt jede Instanz eines Arrays (definiert mit eckigen Klammern |_+_| oder — ungewöhnlicher — mit |_+_|) von |_+_| , weshalb Methoden wie |_+_| , |_+_| und |_+_|sind standardmäßig verfügbar.

Das gleiche gilt für praktisch jedes andere eingebaute Objekt, wie Strings und Boolean: nur wenige, wie |_+_| , |_+_| , |_+_| und |_+_| haben keine Eigenschaften oder Methoden.

Am Ende der Prototypenkette finden wir |_+_| , und fast jedes Objekt in JavaScript ist eine Instanz von |_+_| : |_+_| und |_+_| , beispielsweise erben sowohl Eigenschaften als auch Methoden von |_+_| .

Um einem Objekt mithilfe der Prototypsyntax Eigenschaften und Methoden hinzuzufügen, können Sie das Objekt einfach als Funktion initiieren und das |_+_| . verwenden Schlüsselwort zum Hinzufügen von Eigenschaften und Methoden:

infinity

Sollte ich das Verhalten von Prototypen überschreiben oder erweitern?

Es ist möglich, das Verhalten von eingebauten Prototypen genauso zu ändern, wie wir unsere eigenen Prototypen erstellen und erweitern können, aber die meisten Entwickler (und die meisten Unternehmen) würden davon abraten.

Wenn Sie möchten, dass mehrere Objekte dasselbe Verhalten aufweisen, können Sie jederzeit ein benutzerdefiniertes Objekt erstellen (oder Ihre eigene 'Klasse' oder 'Unterklasse' definieren), das von einem integrierten Prototyp erbt, ohne Änderungen am Prototyp selbst vorzunehmen. Wenn Sie mit anderen Entwicklern zusammenarbeiten, haben diese bestimmte Erwartungen an das Standardverhalten von JavaScript, und das Bearbeiten dieses Standardverhaltens kann leicht zu Fehlern führen.

Es ist jedoch erwähnenswert, dass nicht jeder diesen starken Widerstand gegen die Erweiterung eingebauter Prototypen teilt. Siehe zum Beispiel dieser Artikel von Brendan Eich, dem Schöpfer von JavaScript . In diesem Artikel (aus dem Jahr 2005) schlug Eich vor, dass das Prototypsystem tatsächlich gebaut wurde – teilweise – um Erweiterungen zu ermöglichen!

passives zu aktives Sprachkonverter-Tool

Insgesamt hoffe ich, dass diese Fragen Ihnen geholfen haben, JavaScript besser zu verstehen – sowohl seine Kernfunktionen als auch seine ungewöhnlicheren Eigenheiten – und dass Sie sich besser auf Ihr nächstes Vorstellungsgespräch vorbereitet fühlen.

Wenn Sie kürzlich interviewt wurden, würde ich gerne mehr über Ihre Erfahrungen erfahren! Welche Fragen kamen auf?

Oder sind Sie Interviewer, sehen Sie in Fragen wie den oben aufgeführten Wert? Oder legen Sie mehr Gewicht auf andere Bereiche, wie technische Herausforderungen oder frühere Projekte?

#javascript

medium.com

9 Fragen in Vorstellungsgesprächen für JavaScript

9 JavaScript-Interview-Fragen - Umfassende, von der Community getriebene Liste wichtiger JavaScript-Interview-Fragen. Egal, ob Sie ein Kandidat oder ein Vorstellungsgespräch sind, diese Fragen im Vorstellungsgespräch helfen ...