web-dev-qa-db-fra.com

JavaScript est-il un langage non typé?

J'ai trouvé que certaines personnes appellent JavaScript un langage "dynamiquement, faiblement typé", mais certains disent même "non typé"? C'est quoi vraiment?

91
Deniz Dogan

JavaScript est non typé:


(source: no.Gd )

Même Brendan Eich le dit. Sur Twitter, il a répondu à un fil lié à cette question:

... les types académiques utilisent "non typé" pour signifier "pas de types statiques" ...

Le problème est donc qu'il existe différentes définitions de non typé.

Une définition a été évoquée dans l'une des réponses ci-dessus - le runtime ne marque pas les valeurs et traite simplement chaque valeur comme des bits. JavaScript le fait valeurs de balises et a un comportement différent en fonction de ces balises. Donc, JavaScript ne correspond évidemment pas à cette catégorie.

L'autre définition provient de Théorie du langage de programmation (la chose académique à laquelle Brendan fait référence). Dans ce domaine, non typé signifie simplement tout appartient à un seul type .

Pourquoi? Parce qu'un langage ne génèrera un programme que s'il peut prouver que les types s'alignent (alias la correspondance Curry-Howard ; les types sont des théorèmes, les programmes sont des preuves). Cela signifie dans une langue non typée:

  1. Un programme est toujours généré
  2. Par conséquent, les types toujours correspondent
  3. Il ne doit donc y avoir que un type

Contrairement à une langue dactylographiée:

  1. Un programme peut-être pas sera généré
  2. Parce que les types peut-être pas correspondent
  3. Parce qu'un programme peut contenir plusieurs types

Alors voilà, en PLT, non typé signifie simplement typé dynamiquement et typé signifie simplement typé statiquement . JavaScript n'est certainement pas typé dans cette catégorie.

Voir également:

119
Brian McKenna

fort/faible peut être pensé par rapport à la façon dont le compilateur, le cas échéant, gère la saisie.

  • Faiblement tapé signifie que le compilateur, le cas échéant, n'applique pas un typage correct. Sans interjection implicite du compilateur, l'instruction générera une erreur lors de l'exécution.

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

    Fortement tapé signifie qu'il y a un compilateur, et il vous veut une distribution explicite de chaîne à entier .

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

    Dans les deux cas, certaines fonctionnalités du compilateur peuvent implicitement modifier l'instruction pendant la compilation pour effectuer des conversions pour vous, s'il peut déterminer que c'est la bonne chose à faire.

    Jusqu'à présent, JavaScript peut être classé comme non fortement typé. Cela signifie qu'il est faiblement typé ou non typé.

dynamique/statique peut être pensé par rapport à la façon dont les instructions de langage manipulent les types.

  • Typé dynamiquement signifie la valeur type est appliqué, mais la variable représente simplement n'importe quelle valeur de n'importe quel type.

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

    Typiquement signifie la variable le type est fortement appliqué et le type de valeur l'est moins.

    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.
    

    Jusqu'à présent, JavaScript peut être classé comme non typé. En outre, il semble être typé dynamiquement, voire pas du tout. Nous devons donc voir ce que signifie taper.

Dactylographié signifie que le langage fait la distinction entre différents types tels que chaîne , nombre , booléen , objet , tableau , null , non défini et ainsi de suite. De plus, chaque opération est liée à des types spécifiques. Vous ne pouvez donc pas diviser un entier par une chaîne .

    2 / "blah"  // produces NaN

Sans type signifie l'opération de division entier par La chaîne entraînerait le traitement des quatre premiers octets de la chaîne comme un entier . Cela est dû au fait que les opérations non typées ont lieu directement sur les bits, il n'y a aucun type à observer. Le résultat sera quelque chose d'assez inattendu:

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

Puisque JavaScript se comporte selon la définition d'être typé, il doit l'être. Et par conséquent, il doit être typé dynamiquement et typé faiblement.

Si quelqu'un prétend que JavaScript n'est pas typé, c'est simplement pour la théorie académique, pas pour une application pratique.

74
Gumbo

JavaScript est faiblement tapé . Il n'est certainement pas "non typé" mais sa nature faiblement typée permet une grande flexibilité en termes de conversions implicites.

Gardez à l'esprit que JavaScript est également typé dynamiquement. Cette méthode de saisie permet ce que l'on appelle "typage du canard" .

À titre de comparaison, considérons que JavaScript n'est pas fortement typé ni typé statiquement. Parfois, comprendre ce que quelque chose n'est pas peut vous aider à mieux voir ce que c'est.

44
Andrew Hare

Pour l'auteur, JavaScript est également classé comme typé dynamiquement . Wiki indique que les types typés dynamiquement sont vérifiés au moment de l'exécution plutôt que dans un compilateur tandis que typé faiblement fait référence à la possibilité de changer de type à la volée dans votre code. Donc oui, il est à la fois typé dynamiquement ET faiblement typé.

7
Darren Newton

Le problème ici qui déroute beaucoup de programmeurs est que de telles définitions ne sont pas standardisées quelque part. Le terme langage de programmation non typé est ambigu. Cela fait-il référence à une langue qui n'a pas de types de données ou à une langue qui est un lambda calcul variante non typée ?

JavaScript/ECMAScript a un système de type et tous les domaines de ses fonctions accepteront tout type de spécification de référence. Cela signifie donc que JavaScript a un seul type de données, en réalité. C'est une question d'implémentation qui est plus importante pour les programmeurs JavaScript très avancés. Le programmeur JavaScript moyen ne se soucie que des abstraitstypes de données de langue qui ont été spécifiés par ECMAScript.

Dans le contexte du programmeur ordinaire, et non du chercheur ou de l'informaticien théorique, le terme non typé est un terme impropre car la plupart des gens ne font pas de calcul lambda. Ainsi, le terme confond les masses et semble déclarer que JavaScript n'a pas de types de données, ce qui n'est tout simplement pas vrai. Quiconque a déjà utilisé typeof sait que JavaScript a ses propres types de données de langue:

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

les rendements

"chaîne"

ECMAScript définit les types suivants pour la langue: undefined, null, string, boolean, number, object

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

Une désignation plus précise pour JavaScript serait typée implicitement, dynamiquement ou faiblement/vaguement (ou une combinaison de ceux-ci), dans la mesure où JavaScript utilise coercition de type dans certains cas, ce qui rend le type implicite parce que vous ne pas besoin de spécifier explicitement le type de vos variables. Il tombe sous faiblement typé car, contrairement à certaines langues qui distinguent flottant et entier, etc., il utilise simplement un type number pour englober tous les nombres, et utilise le type coercition mentionné précédemment[Section 9 de la spécification ECMAScript], contrairement à un langage fortement typé qui aurait des types de données très spécifiques (c'est-à-dire que vous devriez spécifier int ou float).

Les définitions des langages de type statique et dynamique ne sont pas normalisées, mais la taille d'un octet non plus n'était pas le cas lorsque les ordinateurs commençaient à évoluer. Le typage statique et dynamique fait le plus souvent référence à la présence de certaines fonctionnalités linguistiques. L'un d'eux est vérification de type à l'exécution , ou ce qu'on appelle vérification de type dynamique . Si vous avez utilisé JavaScript, vous savez déjà qu'il attend définitivement l'exécution pour vérifier les types, c'est pourquoi vous obtenez des exceptions TypeError lors de l'exécution de votre code. Exemple ici

Je pense que la réponse la plus votée est source de confusion polymorphisme des fonctions JavaScript avec des fonctions qui accepteront littéralement n'importe quoi (comme avec des variantes non typées de Lambda Calculus) qui est un Association Fallacy .

6
Alex W

N'oubliez pas que JavaScript vous permet de demander quelle est la typeof(your_variable) et de comparer les types: 5==="5" renvoie false. Je ne pense donc pas que vous puissiez l'appeler non typé.

Il est dynamiquement et (estimé comme) faiblement typé. Vous voudrez peut-être savoir qu'il utilise le typage Duck (voir le lien d'Andrew) et offre OOP cependant Prototypage au lieu des classes et de l'héritage.

1
instanceof me

Bien qu'il soit tapé (vous pouvez demander "typeof someVar" et apprendre son type spécifique, il est très faible.

Donné:

  var a = "5";

vous pourriez dire que a est une chaîne. Cependant, si vous écrivez ensuite:

  var b = a + 10;

b est un int égal à 15, donc a agi comme un int. Bien sûr, vous pouvez alors écrire:

  var c = a + "Hello World";

et c sera égal à "5Hello World", donc a agit à nouveau comme une chaîne.

0
James Curran