Ist JavaScript eine untypisierte Sprache?


104

Ich habe festgestellt, dass einige Leute JavaScript als "dynamisch, schwach typisierte" Sprache bezeichnen, andere sogar "untypisiert" sagen. Welches ist es wirklich?

Antworten:


133

JavaScript ist untypisiert:


(Quelle: no.gd )

Sogar Brendan Eich sagt es. Auf Twitter antwortete er auf einen Thread, der mit dieser Frage verknüpft war:

... akademische Typen verwenden "untypisiert", um "keine statischen Typen" zu bedeuten ...

Das Problem ist also, dass es einige unterschiedliche Definitionen von untypisiert gibt .

In einer der obigen Antworten wurde über eine Definition gesprochen - die Laufzeit markiert keine Werte und behandelt jeden Wert nur als Bits. JavaScript führt Tag-Werte aus und hat basierend auf diesen Tags ein anderes Verhalten. JavaScript passt also offensichtlich nicht in diese Kategorie.

Die andere Definition stammt aus der Programmiersprachentheorie (die akademische Sache, auf die sich Brendan bezieht). In dieser Domäne bedeutet untypisiert nur, dass alles zu einem einzigen Typ gehört .

Warum? Da eine Sprache nur dann ein Programm generiert, wenn sie nachweisen kann, dass die Typen übereinstimmen (auch bekannt als Curry-Howard-Korrespondenz ; Typen sind Theoreme, Programme sind Beweise). Dies bedeutet in einer untypisierten Sprache:

  1. Ein Programm wird immer generiert
  2. Daher stimmen die Typen immer überein
  3. Daher darf es nur einen Typ geben

Im Gegensatz zu einer getippten Sprache:

  1. Möglicherweise wird kein Programm generiert
  2. Weil Typen möglicherweise nicht übereinstimmen
  3. Weil ein Programm mehrere Typen enthalten kann

Also los geht's, in PLT bedeutet untypisiert nur dynamisch getippt und getippt bedeutet nur statisch getippt . JavaScript ist in dieser Kategorie definitiv untypisiert.

Siehe auch:


6
Und natürlich ist "keine statischen Typen" auch nicht dasselbe wie "keine Typdeklarationen".
Andreas Rossberg

+1. Sie sollten vielleicht auch einen Link dies in Ihrer Antwort. Dieses "schwach typisierte" bs ist zu weit verbreitet.
fehlender Faktor

2
Die Programmiersprachtheorie ist korrekt. Der riesige Screenshot ist falsch.
Alex W

2
Ich war froh zu sehen, dass diese Antwort auf Harpers Blog-Post verwies, aber es wäre schön, wenn die PLT-Community "untypisiert" zugunsten von "unitped" fallen lassen würde. Die Definition von "untypisiert", was "nur Bits" bedeutet, ist tatsächlich sinnvoll. Die Verwendung von "untypisiert" zur Beschreibung einer Sprache, deren formale Spezifikation das Wort "Typ" verwendet und besagt, dass es sieben Typen gibt (Undefiniert, Null, Zahl, Zeichenfolge, Boolescher Wert, Symbol und Objekt), ist wirklich verwirrend. Die meisten Menschen wollen diesen Typbegriff nicht vom PLT-Def unterscheiden.
Ray Toal

4
Ihre 1. 2. 3.für eine untypisierte Sprache passen nicht zu JavaScript. Es gibt nicht nur einen Typ - es gibt ungefähr 4 - 5. Wie zeigt das, dass JavaScript untypisiert ist?
Don Cheadle

82

Man kann sich stark / schwach in Bezug darauf vorstellen, wie der Compiler gegebenenfalls mit der Eingabe umgeht.

  • Schwach typisiert bedeutet, dass der Compiler, falls zutreffend, die korrekte Eingabe nicht erzwingt. Ohne implizite Interjektion des Compilers tritt der Befehl zur Laufzeit auf.

    "12345" * 1 === 12345  // string * number => number

    Stark typisiert bedeutet, dass es einen Compiler gibt, der eine explizite Umwandlung von Zeichenfolge in Ganzzahl wünscht.

    (int) "12345" * 1 === 12345

    In beiden Fällen können einige Compilerfunktionen die Anweisung während der Kompilierungszeit implizit ändern, um Konvertierungen für Sie durchzuführen, wenn dies die richtige Vorgehensweise darstellt.

    Bisher kann JavaScript als nicht stark typisiert eingestuft werden. Das bedeutet entweder, dass es schwach oder nicht typisiert ist.

Dynamisch / Statisch kann in Bezug darauf betrachtet werden, wie die Sprachanweisungen Typen manipulieren.

  • Dynamisch typisiert bedeutet, dass derTypdes Werts erzwungen wird, die Variable jedoch einfach einen beliebigen Wert eines beliebigen Typs darstellt.

    x = 12345;    // number
    x = "string"; // string
    x = { key: "value" }; // object
    y = 123 + x; // error or implicit conversion must take place.

    Statisch typisiert bedeutet, dass der Variablentyp stark erzwungen wird und der Werttyp weniger erzwungen wird.

    int x = 12345; // binds x to the type int
    x = "string";  // too late, x is an integer - error
    string y = 123; // error or implicit conversion must take place.

    Bisher kann JavaScript als nicht statisch typisiert eingestuft werden. Außerdem scheint es dynamisch typisiert zu sein, wenn überhaupt. Wir müssen also sehen, was Tippen bedeutet.

Typisiert bedeutet, dass die Sprache zwischen verschiedenen Typen wie Zeichenfolge , Zahl , Boolescher Wert , Objekt , Array , Null , Undefiniert usw. unterscheidet. Außerdem ist jede Operation an bestimmte Typen gebunden. Sie können also keine Ganzzahl durch eine Zeichenfolge teilen.

    2 / "blah"  // produces NaN

Untyped bedeutet, dass die Division der Ganzzahl durch die Zeichenfolge dazu führen würde, dass die ersten vier Byte der Zeichenfolge als Ganzzahl behandelt werden . Dies liegt daran, dass nicht typisierte Operationen direkt an Bits stattfinden und keine Typen zu beobachten sind. Das Ergebnis wird etwas ganz Unerwartetes sein:

    2 / "blah"  // will be treated as  2 / 1500275048

Da sich JavaScript gemäß der Definition der Typisierung verhält, muss dies der Fall sein. Und deshalb muss es dynamisch und schwach typisiert sein.

Wenn jemand behauptet, JavaScript sei untypisiert, dient dies lediglich der akademischen Theorie und nicht der praktischen Anwendung.


1
Aber ich denke, die letzte Aussage enthält einen Widerspruch. In JavaScript ist das Ergebnis einer Ganzzahl-Zeichenfolgen-Division für jeden Wert der Ganzzahl oder Zeichenfolge genau definiert. Es ist einfach nicht sehr nützlich!
Deniz Dogan

Wenn Sie eine bessere Definition / Beschreibung haben, können Sie diese gerne bearbeiten. Deshalb habe ich es zum Community-Wiki gemacht.
Gumbo

@skurpur: Du hast die Bedeutungen der dynamischen und schwachen Eingabe komplett vertauscht - das wurde korrigiert.
Rene Saarsoo

Oh, sorry, du hast es bearbeitet, warum ich es auch bearbeitet habe und deine Änderungen überschrieben habe.
Rene Saarsoo

3
-1. Sie müssen lesen diese .
fehlender Faktor

48

JavaScript ist schwach typisiert . Es ist sicherlich nicht "untypisiert", aber seine schwach typisierte Natur ermöglicht viel Flexibilität in Bezug auf implizite Konvertierungen.

Beachten Sie, dass JavaScript auch dynamisch eingegeben wird. Diese Schreibweise ermöglicht das sogenannte "Ententippen" .

Beachten Sie zum Vergleich, dass JavaScript weder stark noch statisch typisiert ist. Manchmal hilft es Ihnen zu verstehen, was etwas nicht ist, um besser zu sehen, was es ist.


2
-1. Sie müssen lesen diese .
fehlender Faktor

3
Diese Antwort ist viel besser und genauer als die am besten gewählte Antwort.
Alex W

3
@ JimboJonny: Nicht korrekt. Ohne die Anwesenheit eines Entwicklers der Versammlung wäre es nicht zu falsch zu behaupten, dass jede Sprache getippt ist. Untyped bedeutet, dass die einzigen Operationen direkt die Bitmanipulation betreffen. Beachten Sie jedoch, dass Javascript über die Methoden toString () und parseInt () verfügt. Lassen Sie sich nicht viel mehr tippen.
Suamere

2
@Suamere - Hier ist ein Zitat aus "Javascript: The Definitive Guide" von O'Reilly: "Ein wichtiger Unterschied zwischen JavaScript und Sprachen wie Java und C besteht darin, dass JavaScript untypisiert ist. Dies bedeutet zum Teil, dass eine JavaScript-Variable einen Wert eines beliebigen Datentyps enthalten kann, im Gegensatz zu einer Java- oder C-Variablen, die nur den einen bestimmten Datentyp enthalten kann, für den sie deklariert ist. “
Jimbo Jonny

3
Wenn Sie sich also in die BS einkaufen, behauptet ein Typ, dass akademische Leute das Wort "untypisiert" absichtlich verwenden, um "dynamisch getippt" zu bedeuten. Dann ja, JavaScript wird von all Ihren Beweisen untypisiert. Wenn Sie jedoch wissen, dass "untypisiert" fälschlicherweise verwendet wird, um Sprachen darzustellen, die wirklich "dynamisch typisiert" sind, nennen Sie die Dang-Sprachen einfach "dynamisch typisiert". tinyurl.com/czhcv54
Suamere

8

Nach Ansicht des Autors wird JavaScript auch als dynamisch typisiert klassifiziert . Das Wiki gibt an, dass dynamisch typisierte Sprachen zur Laufzeit anstatt in einem Compiler typgeprüft werden, während sich schwach typisierte Sprachen auf die Möglichkeit beziehen, den Typ innerhalb Ihres Codes im laufenden Betrieb zu ändern. Also ja, es ist sowohl dynamisch als auch schwach typisiert.


6

Das Problem, das viele Programmierer verwirrt, ist, dass Definitionen wie diese nicht irgendwo standardisiert sind. Der Begriff untypisierte Programmiersprache ist nicht eindeutig. Heißt das , auf eine Sprache beziehen , die keine hat Datentypen oder eine Sprache , die eine Lambda - Kalkül ist nicht typisierte Variante ?

JavaScript / ECMAScript verfügt über ein Typsystem, und alle Domänen seiner Funktionen akzeptieren alle Referenzspezifikationstypen. Das bedeutet, dass JavaScript in Wirklichkeit einen einzigen Datentyp hat. Dies ist eine Frage der Implementierung, die für die fortgeschrittenen JavaScript-Programmierer wichtiger ist. Der durchschnittliche JavaScript-Programmierer kümmert sich nur um die von ECMAScript angegebenen Datentypen für abstrakte Sprachen .

Im Kontext des alltäglichen Programmierers, nicht des Forschers oder theoretischen Informatikers, ist der Begriff untypisiert eine Fehlbezeichnung, da die meisten Menschen keine Lambda-Berechnung durchführen. Somit verwirrt der Begriff die Massen und scheint zu erklären, dass JavaScript keine Datentypen hat, was einfach nicht wahr ist. Jeder, der jemals verwendet hat, typeofweiß, dass JavaScript seine eigenen Sprachdatentypen hat:

var test = "this is text";
typeof(test);

ergibt

"string"

ECMAScript definiert die folgenden Arten für die Sprache: undefined, null, string, boolean, number,object

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Eine genauere Bezeichnung für JavaScript würde implizit typisiert, dynamisch typisierte oder schwach / lose eingegeben werden (oder eine Kombination davon), dass JavaScript verwendet Typumwandlung in einigen Fällen , die die Art implizite macht , weil Sie müssen nicht explizit die angeben Art Ihrer Variablen. Es fällt unter schwach typisiert, da es im Gegensatz zu einigen Sprachen, die zwischen float und integer usw. unterscheiden, nur einen numberTyp verwendet, um alle Zahlen zu erfassen, und den zuvor erwähnten Typenzwang [Abschnitt 9 der ECMAScript-Spezifikation] verwendet , im starken Gegensatz zu a stark typisierte Sprache, die sehr spezifische Datentypen haben würde (dh Sie müssten angeben intoder float).

Die Definitionen statisch und dynamisch typisierter Sprachen sind nicht standardisiert, hatten jedoch auch nicht die Größe eines Bytes, als sich die Computer zu entwickeln begannen. Statische und dynamische Typisierung beziehen sich meistens auf das Vorhandensein bestimmter Sprachmerkmale. Eine davon ist die Typprüfung zur Laufzeit oder die sogenannte dynamische Typprüfung . Wenn Sie JavaScript verwendet haben, wissen Sie bereits, dass es definitiv bis zur Laufzeit wartet, um Typen zu überprüfen, weshalb Sie TypeErrorbei der Ausführung Ihres Codes Ausnahmen erhalten. Beispiel hier

Ich denke, die am häufigsten gewählte Antwort verwechselt den Polymorphismus von JavaScript-Funktionen mit Funktionen, die buchstäblich alles akzeptieren (wie bei untypisierten Varianten von Lambda Calculus), was ein Assoziationsfehler ist .


Es ist keine Fehlbezeichnung, aber der Kontext ist wichtig, siehe stackoverflow.com/questions/9154388/…
Andreas Rossberg

@AndreasRossberg Es ist absolut ist eine falsche Bezeichnung. Was Sie in Ihrem schamlos selbst beworbenen Link erwähnen , ist ein Typensystem. Der Grund, warum der Begriff eine falsche Bezeichnung ist, liegt darin, dass er nicht eindeutig ist. Die meisten Programmierer denken, dass Datentyp kein Typsystem ist, wenn sie von einer untypisierten Sprache hören . Ich denke, Konrad Rudophs Kommentar treibt diesen Punkt wirklich nach Hause.
Alex W

Ich bin mir nicht sicher, warum Sie es "schamlos" finden, auf meine vorherige Antwort zu verweisen, anstatt sie hier zu wiederholen. Außerdem habe ich klar gesagt, dass der Kontext wichtig ist. Im Gegensatz zu K. Rudolphs Beschwerde gibt es in der Literatur vollkommen konsistente und weithin akzeptierte Definitionen des "Typensystems", und ich habe eine zitiert. Natürlich können Sie sie in Ihrem Kontext verwirrend finden, aber das macht sie nicht zu "Fehlbezeichnungen".
Andreas Rossberg

@AndreasRossberg Der Kontext ist hier sehr wichtig. Die Antwort mit der höchsten Bewertung lautet "untypisiert = keine Typdeklarationen", was eindeutig falsch ist. Was ich sage ist, dass es in diesem Zusammenhang eine Fehlbezeichnung ist. Niemand erwähnte hier die Lambda-Rechnung, und dies zu tun, ist in diesem einfachen Fall etwas anmaßend.
Alex W

1

Denken Sie daran, dass Sie mit JavaScript fragen können, was das ist typeof(your_variable), und Typen vergleichen können: 5==="5"Rückgaben false. Daher glaube ich nicht, dass man es als untypisiert bezeichnen kann.

Es ist dynamisch und (geschätzt als) schwach typisiert. Vielleicht möchten Sie wissen, dass es Duck-Typisierung verwendet (siehe Andrews Link) und OOP durch Prototyping anstelle von Klassen und Vererbung bietet .


Die Eingabe einer Variablen hat nichts mit der Umwandlung von Werten zu tun. Es hat mit Typdeklarationen für Variablen zu tun. Javascript hat dafür überhaupt kein Konstrukt, weshalb so wenige Javascripter das Konzept überhaupt verstehen und warum so viele von ihnen die Variablentypisierung als etwas missverstehen, das mit dem Vergleichen oder Casting von Variablentypen zu tun hat. In JS können Sie String a = "blah";oder var a:String = 'blah';(dh typisierte Variablen) überhaupt nicht deklarieren . Deshalb ist es untypisiert.
Jimbo Jonny

0

Während es getippt ist (Sie können "typeof someVar" fragen und seinen spezifischen Typ lernen, ist es sehr schwach.

Gegeben:

  var a = "5";

Man könnte sagen, dass a eine Zeichenfolge ist. Wenn Sie dann jedoch schreiben:

  var b = a + 10;

b ist ein int gleich 15, also hat a genau wie ein int gehandelt. Natürlich können Sie dann schreiben:

  var c = a + "Hello World";

und c ist gleich "5Hello World", also verhält sich a wieder wie eine Saite.


1) Einen Wert umwandeln! = Eine Variable eingeben 2) Es ist nicht schwach, es existiert nicht. Sie können keine Variable in Javascript eingeben.
Jimbo Jonny

Neugierig, warum diese Antwort zwei Stimmen nach unten bekam. Die Definition, die ich bei schwacher Typisierung gefunden habe, sagt genau Folgendes: Der Typ eines Werts wird basierend auf seiner Verwendung bestimmt.
Aioobe

Ist das aber genau? Ich werde bgleich 510: ideone.com/BRcSW7
aioobe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.