Ich habe festgestellt, dass einige Leute JavaScript als "dynamisch, schwach typisierte" Sprache bezeichnen, andere sogar "untypisiert" sagen. Welches ist es wirklich?
quelle
Ich habe festgestellt, dass einige Leute JavaScript als "dynamisch, schwach typisierte" Sprache bezeichnen, andere sogar "untypisiert" sagen. Welches ist es wirklich?
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:
Im Gegensatz zu einer getippten Sprache:
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:
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?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.
Stark typisiert bedeutet, dass es einen Compiler gibt, der eine explizite Umwandlung von Zeichenfolge in Ganzzahl wünscht.
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.
Statisch typisiert bedeutet, dass der Variablentyp stark erzwungen wird und der Werttyp weniger erzwungen wird.
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.
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:
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.
quelle
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.
quelle
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.
quelle
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,
typeof
weiß, dass JavaScript seine eigenen Sprachdatentypen hat:ergibt
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
number
Typ 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 angebenint
oderfloat
).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
TypeError
bei der Ausführung Ihres Codes Ausnahmen erhalten. Beispiel hierIch 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 .
quelle
Denken Sie daran, dass Sie mit JavaScript fragen können, was das ist
typeof(your_variable)
, und Typen vergleichen können:5==="5"
Rückgabenfalse
. 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 .
quelle
String a = "blah";
odervar a:String = 'blah';
(dh typisierte Variablen) überhaupt nicht deklarieren . Deshalb ist es untypisiert.Während es getippt ist (Sie können "typeof someVar" fragen und seinen spezifischen Typ lernen, ist es sehr schwach.
Gegeben:
Man könnte sagen, dass a eine Zeichenfolge ist. Wenn Sie dann jedoch schreiben:
b ist ein int gleich 15, also hat a genau wie ein int gehandelt. Natürlich können Sie dann schreiben:
und c ist gleich "5Hello World", also verhält sich a wieder wie eine Saite.
quelle
b
gleich510
: ideone.com/BRcSW7