Ein erster Blick auf JavaScript mit den Augen eines Java-Entwicklers



Java und JavaScript sind nicht dasselbe! Jetzt kennen Sie das Hauptgeheimnis der Maurer. In diesem Artikel möchte ich Ihnen Gedanken und Gedanken zur JavaScript-Sprache mit den Augen eines Java-Entwicklers mitteilen. Ich werde Datenstrukturen, Typen, Funktionen, Objekte, Klassen und andere gemeinsame Merkmale von Java und JavaScript vergleichen.

Stiftung


JavaScript ist eine interpretierte Skriptsprache zum Schreiben von Skripten. Dies bedeutet, dass der von Ihnen geschriebene Code Zeile für Zeile von Anweisung zu Anweisung, von Skript zu Skript ausgeführt wird. Java ist eine kompilierte Sprache. Dies bedeutet, dass der Compiler vor dem Starten eines Java-Programms den gesamten von Ihnen geschriebenen Code in einen speziellen Maschinencode übersetzen muss, der für den JVM- Bytecode verständlich ist.

Die Nachteile für einen Java-Entwickler, der mit dem Schreiben in JS begonnen hat, im Zusammenhang mit diesen Unterschieden sind folgende:

  • Bevor Sie mit der Kompilierung Ihres in Java geschriebenen Codes beginnen, führt der Compiler für Sie eine Analyse und semantische Analyse durch und benachrichtigt Sie bei Problemen darüber. Es stellt sich heraus, dass Sie die Möglichkeit haben, sich vor dem Starten der Anwendung über den Fehler zu informieren. In JS gibt es aufgrund des Fehlens eines Compilers keine solche Überprüfung. Und die Fehler, die Sie zum Zeitpunkt des Schreibens des Codes gemacht haben, werden erst nach dem Start des Skripts erkannt.
  • Die folgenden Unannehmlichkeiten sind nur für JS-Versionen vor ES5 möglich. Weil JavaScript wird zeilenweise ausgeführt. Schreibfunktionen, die andere Funktionen aufrufen, unterscheiden sich von den Prinzipien von Bobs „Onkel“ Pure Code , der für das Schreiben von Programmen in Java gepredigt wird. Wenn Sie in JS die Funktion bar () über die Funktion foo () aufrufen müssen, müssen Sie bar () vor foo () definieren . Wenn Sie wie in Java-Anwendungen das Gegenteil tun, schlägt der Aufruf in einigen älteren Browsern möglicherweise fehl.

//   Java public class JavaVsJS { public static void foo(String name) { bar(name); } private static void bar(String name) { System.out.println(name); } public static void main(String[] args) { JavaVsJS.foo("Igor Ivanovich"); } } 

 //   JavaScript var name = "Igor Ivanovich"; //  bar()      foo() function bar(name) { document.write(name); } function foo(name) { bar(name); } foo(name); 

Variablen und ihre Typen


JavaScript ist im Gegensatz zu Java eine schwach typisierte Sprache. Einerseits bietet es mehr Flexibilität, andererseits mehr Möglichkeiten, einen Schuss ins Bein abzufeuern. Um eine Variable in JS zu deklarieren, reicht es aus, das Schlüsselwort var zu verwenden. Geben Sie anschließend den Variablennamen und gegebenenfalls den Wert an. In der Praxis ist es nicht erforderlich, das Schlüsselwort var zu verwenden .

 var name_1 = "Igor Ivanovich"; name_2 = "Renat Raphaelevich"; 

Nun zu den Typen. In JS gibt es keine unterschiedlichen Typen für Ganzzahlen und Gleitkommazahlen. Sie werden in Typennummer kombiniert. String , Boolean sind die gleichen wie in Java. JS hat einen Objekttyp . Wenn es sich in Java um eine Oberklasse aller Klassen handelt, ist es in JS nur einer der Typen.

 var a_number = 10; // number var b_number = 10.01; // number var a_string = "10"; // string var b_string = "10.1"; // string var tr = true; //boolean var person = {name: "Igor", secondName: "Ivanovich"}; //object 

Der Java-Entwickler sollte nicht verwirrt sein. Versuchen wir nun, Operationen zwischen Objekten unterschiedlichen Typs auszuführen und zu sehen, was passiert.

 10 +1 > 11 10 +"1" > "101" true && false > false true && 1 > 1 true && 0 > 0 true && "1" > "1" false && "1" > false false && 0 > false 0.1 + 0.7 > 0.7999999999999999 

Einige Ergebnisse können den Java-Entwickler etwas verwirren. Zum Beispiel die Fähigkeit, den booleschen Typ folgendermaßen zu verwenden: true && 1 und gleichzeitig eine Art Ergebnis zu erhalten. In Java ist es unmöglich, eine solche Operation auszuführen, weil Der Compiler gibt eine Fehlermeldung aus, dass Sie den Operator && nicht mit anderen Typen als boolean verwenden können . Achten wir nun auf einen weiteren Unterschied zwischen JS und Java: die Operatoren === und ! == . Dies sind Vergleichsoperationen, die von einer schwach typisierten Sprache wie JS benötigt werden. === - gibt true zurück, wenn die verglichenen Objekte den gleichen Wert haben und ihre Typen übereinstimmen. ! == gibt true zurück, wenn die verglichenen Objekte nicht den gleichen Wert haben oder ihre Typen nicht übereinstimmen. Schauen wir uns einige Beispiele an:

 10 == 10 > true 10 == "10" > true 10 === "10" > false 10 != "10" > false 10 !== "10" > true 10 !== 10 > false 

Funktionen


Sowohl in JS als auch in Java können Funktionen einen Wert mit oder ohne Argumente zurückgeben / nicht zurückgeben. Sie können die Funktion sowohl im JS-Code aufrufen, wie im obigen Beispiel gezeigt, als auch indem Sie auf ein bestimmtes Ereignis im HTML-Markup-Element reagieren.

 <!--          --> <input type="button" value="CLICK" onclick="foo();"> //  foo() function foo() { document.write("Calling foo"); } 

Wenn Sie auf die Schaltfläche auf der Seite klicken, wird als Ergebnis des Aufrufs der Funktion "Calling foo" gedruckt. Nun zu den Kuriositäten, auf die ein Java-Entwickler achten könnte. Kehren wir zum obigen Beispiel zurück, in dem die Funktion foo () die Funktionsleiste () an sich aufruft - die nur als interne Funktion verwendet wird. Nach der Idee erwarten wir, dass es privat gemacht werden kann. In JS gibt es jedoch keine Zugriffsselektoren. Es gibt keine Möglichkeit, das private Feld vor der Funktionsdeklaration durch einfaches Hinzufügen dieses Wortes zu ergänzen. Gehen wir weiter. Erstellen wir ein Objekt - eine Instanz einer Klasse mit ihren Feldern und einer Methode.

 function getLocation() { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } } function Person(person, age) { this.person = person; this.age = age; this.getLocation = getLocation; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation(); 

Wenn Sie diesen Code mit den Augen eines Java-Entwicklers betrachten, können Sie feststellen, dass die Person- Funktion ein Konstruktor von Objekten der Person- Klasse und eine Definition der in der Klasse enthaltenen Felder und Methoden ist. Die Funktion getLocation () ist eine Funktion der Person- Klasse. Darin verwenden wir den Zugriff auf die Felder der Instanzklasse this.person und this.age . Es ist logisch, dass diese Funktion, die die aktuelle Instanz der Person- Klasse verwendet, nur damit funktioniert und der letzte Aufruf der Funktion getLocation () nicht funktioniert. In JS ist dies jedoch normal, da die Konzepte einer Klasse, Funktion und Klassenmethode verschwommen sind. Alles schwach tippen. Durch Ausführen dieses Skripts erhalten Sie folgende Ausgabe im Browserfenster:

 Your name Igor, location = Vishnevaia 1 Your name undefined, location = rp Sokoloviy 

Wenn Sie den Code jedoch wie folgt umschreiben und eine Funktion innerhalb der Klasse definieren, ist sein Aufruf für die Klasseninstanz nicht verfügbar:

 function Person(person, age) { this.person = person; this.age = age; this.getLocation = function () { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } }; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation(); 

Der letzte Aufruf führt zu einem Fehler, weil Die Funktion getLocation () ist nicht definiert. Es stellt sich heraus, dass es auch in JS keine Zugriffsmodifikatoren gibt, aber es gibt eine Reihe von Funktionen und Variablen, die mit geschweiften Klammern gesteuert werden. JavaScript ist wunderbar mit einer Vielzahl von Optionen, um sich in den Fuß zu schießen.

Arrays


Wenn wir über Arrays sprechen, stellen wir eine Datenstruktur dar, in der derselbe Elementtyp gespeichert ist, auf den über den Index zugegriffen wird. Dies ist in Java. Wenn es um JS und seine schwache Typisierung geht, kommt echte Anarchie ins Spiel. Im folgenden Beispiel erstellen wir 4 Arrays. Im ersten gibt es Elemente unterschiedlichen Typs, im zweiten nur Zahlen, im dritten Booleschen , im vierten Booleschen und in der Nummer :

 var mix = [3, "Igor Ivanovich", "Renat Raphaelevich", "Sergey Sergeevich", 1, 12.3, true]; var numbers = [1,2,3,4,5]; var booleans = [false, false, true]; var mix2 = [false, 1, 2]; document.write("Type elements in mix: "); for (element in mix) { document.write(typeof mix[element] + " "); } document.write("<br /> Type elements in numbers: "); for (element in numbers) { document.write(typeof numbers[element] + " "); } document.write("<br /> Type elements in booleans: "); for (element in booleans) { document.write(typeof booleans[element] + " "); } document.write("<br /> Type elements in mix2: "); for (element in mix2) { document.write(typeof mix2[element] + " "); } var sum = numbers[0] + numbers[1]; document.write("<br /> sum numbers = " + sum); 

Nach dem Ausführen des Skripts sehen wir den Typ jedes Elements jedes Arrays und die Summe der ersten beiden Ziffern aus dem Array von Zahlen.

 Type elements in mix: number string string string number number boolean Type elements in numbers: number number number number number Type elements in booleans: boolean boolean boolean Type elements in mix2: boolean number number sum numbers = 12 

Fazit


Wenn Sie die JavaScript-Sprache zum ersten Mal berühren, kann es vorkommen, dass der Java-Entwickler alle oben genannten Kommentare und Fragen hat. Als ich JS zum ersten Mal traf, erlebte ich nicht die lustigsten Emotionen. Es war eher so: "Was zum ...?" Viele Unterschiede und Missverständnisse liegen im Unterschied zwischen den Typisierungen zweier Sprachen. Ich weiß nicht, warum JS eine schwache Eingabe benötigt.

Vielleicht gibt es Vorteile, warum dies getan wurde. Wenn Sie die Antwort kennen, schreiben Sie in die Kommentare.

Ja, es gibt TypeScript, das getippt zu sein scheint, aber am Ende wird es in dasselbe JS übersetzt. Persönlich bin ich kein Befürworter schwacher Eingabe, aber mein Kollege, der kürzlich JavaScript ausprobiert hat, war aus irgendeinem Grund begeistert davon. Vielleicht ist das Geschmackssache. Und was ist Ihrer Meinung nach besser als schwaches oder starkes Tippen?

Source: https://habr.com/ru/post/de442438/


All Articles