JavaScript est-il un langage non typé?


104

J'ai trouvé que certaines personnes appellent JavaScript un langage «dynamiquement, faiblement typé», mais certains disent même «non typé»? Qu'est-ce que c'est vraiment?

Réponses:


133

JavaScript n'est pas typé:


(source: no.gd )

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

... les types universitaires 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 balise pas les valeurs et traite simplement chaque valeur comme des bits. JavaScript fait des valeurs de variables et a un comportement différent en fonction de ces balises. Donc, JavaScript ne rentre évidemment pas dans cette catégorie.

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

Pourquoi? Parce qu'un langage ne générera un programme que lorsqu'il pourra prouver que les types s'alignent (c'est -à-dire 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 correspondent toujours
  3. Par conséquent, il ne doit y avoir qu'un seul type

Contrairement à une langue typée:

  1. Un programme peut ne pas être généré
  2. Parce que les types peuvent ne pas correspondre
  3. Parce qu'un programme peut contenir plusieurs types

Donc 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:


6
Et bien sûr, "aucun type statique" n'est pas non plus la même chose que "aucune déclaration de type".
Andreas Rossberg

+1. Vous devriez peut-être également lier cela dans votre réponse. Ce bs "faiblement typé" est trop répandu.
missingfaktor

2
La théorie du langage de programmation est correcte. La capture d'écran géante est incorrecte.
Alex W

2
J'étais heureux de voir que cette réponse faisait référence au billet de blog de Harper, mais ce serait bien si la communauté PLT abandonnait "non typé" en faveur de "unityped". La définition de «non typé» signifiant «juste des bits» a en fait un sens. Utiliser "untyped" pour décrire un langage dont la spécification formelle utilise le mot "type" et dit qu'il a sept types (Undefined, Null, Number, String, Boolean, Symbol et Object) est vraiment déroutant. La plupart des gens ne veulent pas distinguer cette notion de type de la définition PLT.
Ray Toal

4
Votre 1. 2. 3.pour une langue non typée ne correspond pas à JavaScript. Il n'y a pas qu'un seul type - il y en a environ 4 - 5. Comment cela démontre-t-il que JavaScript n'est pas typé?
Don Cheadle

82

strong / low peut être considéré en relation avec la façon dont le compilateur, le cas échéant, gère le typage.

  • Faible typé signifie que le compilateur, le cas échéant, n'applique pas le typage correct. Sans interjection implicite du compilateur, l'instruction produira une erreur lors de l'exécution.

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

    Fortement typé signifie qu'il y a un compilateur et qu'il vous demande un cast explicite de chaîne en 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 à votre place, 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 soit qu'il est faiblement typé ou non typé.

dynamique / statique peut être pensé en relation avec la manière dont les instructions de langage manipulent les types.

  • Dynamiquement typé signifie que letype dela valeur 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.

    Le type statique signifie que letype de variable est fortement appliqué et que le type 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é statiquement. En outre, il semble être typé dynamiquement, s'il est tapé du tout. Nous devons donc voir ce que signifie Typing.

Typed signifie que le langage fait la distinction entre différents types tels que chaîne , nombre , booléen , objet , tableau , nul , non défini , etc. 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

Non typé signifie que l'opération de division d'un entier par une chaîne entraînerait le traitement des quatre premiers octets de la chaîne comme un entier . En effet, 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 faiblement typé.

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.


1
Mais je pense qu'il y a une contradiction dans la dernière déclaration. En JavaScript, le résultat d'une division de chaîne entière est bien défini, pour toute valeur de l'entier ou de la chaîne. Ce n'est tout simplement pas très utile!
Deniz Dogan

Si vous avez une meilleure définition / description, n'hésitez pas à la modifier. C'est pourquoi j'ai créé un wiki communautaire.
Gumbo

@skurpur: Vous aviez complètement permuté les significations de la frappe dynamique et faible - corrigé cela.
Rene Saarsoo

Oh, désolé, vous l'avez édité pendant que je le modifais également et j'ai écrasé vos changements.
Rene Saarsoo

3
-1. Vous devez lire ceci .
missingfaktor

48

JavaScript est faiblement typé . 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 le "typage canard" .

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


2
-1. Vous devez lire ceci .
missingfaktor

3
Cette réponse est bien meilleure et beaucoup plus précise que la réponse la plus votée.
Alex W

3
@JimboJonny: Pas correct. Sauf en présence d'un développeur Assembly, il ne serait pas trop incorrect d'indiquer que chaque langue est tapée. Non typé signifie que les seules opérations sont directement sur la manipulation de bits. Mais considérez que Javascript a les méthodes toString () et parseInt (). Ne soyez pas beaucoup plus typé que ça.
Suamere du

2
@Suamere - Voici une citation de «Javascript: le guide définitif» d'O'Reilly: «Une différence importante entre JavaScript et des langages comme Java et C est que JavaScript n'est pas typé. Cela signifie, en partie, qu'une variable JavaScript peut contenir une valeur de n'importe quel type de données, contrairement à une variable Java ou C, qui ne peut contenir que le type particulier de données pour lequel elle est déclarée. »
Jimbo Jonny

3
Donc, si vous achetez dans le BS, un type prétend que les universitaires utilisent à dessein le mot «non typé» pour signifier «typé dynamiquement». Alors oui, JavaScript n'est pas typé par toutes vos preuves. Mais si vous savez que "non typé" est incorrectement utilisé pour représenter des langues qui sont réellement "typées dynamiquement", alors appelez simplement les langues dang "typées dynamiquement". tinyurl.com/czhcv54
Suamere

8

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


6

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

JavaScript / ECMAScript a un système de type et tous les domaines de ses fonctions accepteront n'importe quel 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 de mise en œuvre qui est plus importante pour les programmeurs JavaScript très avancés. Le programmeur JavaScript moyen ne se soucie que des types de données de langage abstrait qui ont été spécifiés par ECMAScript.

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

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

rendements

"chaîne"

ECMAScript définit les types pour la langue suivante: 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 implicitement typée, dynamiquement typée ou faiblement / lâchement typée (ou une combinaison des deux), dans la mesure où JavaScript utilise la coercition de type dans certains cas, ce qui rend le type implicite car vous n'avez pas à spécifier explicitement le type de vos variables. Il est faiblement typé car, contrairement à certains langages qui font la distinction entre float et integer, etc., il utilise juste un numbertype pour englober tous les nombres, et utilise la coercition de type mentionnée précédemment [Section 9 de ECMAScript Spec] , contrairement à un langage fortement typé qui aurait des types de données très spécifiques (c'est-à-dire qu'il faudrait spécifier intou float).

Les définitions des langages à typage statique et dynamique ne sont pas standardisées, mais la taille d'un octet ne l'était pas non plus lorsque les ordinateurs commençaient à évoluer. Le typage statique et dynamique se réfère le plus souvent à la présence de certaines fonctionnalités du langage. L'une d'elles est la vérification de type à l'exécution , ou ce que l'on appelle la 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 TypeErrorexceptions lors de l'exécution de votre code. Exemple ici

Je pense que la réponse la plus votée est de confondre le polymorphisme des fonctions JavaScript avec des fonctions qui accepteront littéralement tout (comme avec des variantes non typées de Lambda Calculus), ce qui est une erreur d'association .


Ce n'est pas un abus de langage, mais le contexte compte, voir stackoverflow.com/questions/9154388/…
Andreas Rossberg

@AndreasRossberg absolument est un abus de langage. Ce à quoi vous faites référence, dans votre lien auto-promu sans vergogne , est un système de type. La raison pour laquelle le terme est un abus de langage est qu'il est ambigu. La plupart des programmeurs pensent que le type de données n'est pas le système de type lorsqu'ils entendent parler d'un langage non typé . Je pense que le commentaire de Konrad Rudoph fait vraiment ressortir ce point.
Alex W

Je ne sais pas pourquoi vous trouvez "sans vergogne" de vous référer à ma réponse précédente au lieu de la répéter ici. De plus, j'ai clairement dit que le contexte était important. Contrairement à la plainte de K. Rudolph, il existe des définitions parfaitement cohérentes et largement acceptées du «système de types» dans la littérature, et j'en ai cité une. Bien sûr, vous êtes libre de les trouver déroutants dans votre contexte, mais cela ne fait pas d'eux des «faux noms».
Andreas Rossberg

@AndreasRossberg Le contexte est ici très important. La réponse la plus votée dit "non typé = aucune déclaration de type", ce qui est clairement incorrect. Ce que je dis, c'est que c'est un abus de langage, dans ce contexte. Personne n'a mentionné le calcul lambda ici et cela est quelque peu prétentieux dans ce cas simple.
Alex W

1

N'oubliez pas que JavaScript vous permet de demander quel est le typeof(your_variable), et de comparer les types: 5==="5"renvoie false. Ainsi, je ne pense 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 la POO via le prototypage au lieu des classes et de l'héritage.


La saisie d'une variable n'a rien à voir avec la conversion des valeurs. Cela concerne les déclarations de types pour les variables. Javascript n'a pas du tout de construction pour cela, c'est pourquoi si peu de javascript comprennent même le concept, et pourquoi tant d'entre eux interprètent mal le typage des variables comme quelque chose à voir avec la comparaison ou la conversion de types de variables. Dans JS, vous ne pouvez pas déclarer String a = "blah";ou var a:String = 'blah';(c'est-à-dire des variables typées) DU TOUT. C'est pourquoi il n'est pas typé.
Jimbo Jonny

0

Tant qu'il est 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 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.


1) Lancer une valeur! = Saisir une variable 2) ce n'est pas faible, c'est inexistant. Vous ne pouvez pas taper une variable en javascript.
Jimbo Jonny

Curieux de savoir pourquoi cette réponse a obtenu deux voix contre. La définition que j'ai trouvée sur un typage faible dit précisément ceci: Le type d'une valeur est déterminé en fonction de la façon dont elle est utilisée.
aioobe

Est-ce exact? Je reçois bégaux 510: ideone.com/BRcSW7
aioobe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.