115 votes

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é" ? Lequel est-il vraiment ?

142voto

Brian McKenna Points 10754

JavaScript est non typée :

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

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

Le problème, c'est qu'il y a plusieurs définitions différentes de non typée .

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 fait et a un comportement différent en fonction de ces balises. JavaScript n'entre donc évidemment pas dans cette catégorie.

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

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

  1. Un programme est toujours généré
  2. Par conséquent, les types toujours correspondre
  3. Par conséquent, il ne peut y avoir que un type

Contrairement à un langage typé :

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

Et voilà, en PLT, non typée signifie simplement typée dynamiquement et dactylographié signifie simplement typée statiquement . JavaScript est définitivement non typé dans cette catégorie.

Voir aussi :

7 votes

Et bien sûr, "pas de types statiques" n'est pas non plus synonyme de "pas de déclarations de types".

0 votes

+1. Vous devriez peut-être aussi créer un lien ce dans votre réponse. Cette connerie de "faiblement typé" est trop répandue.

0 votes

+100,000,000 - bienvenue à la minorité de programmeurs qui comprennent réellement non seulement un langage, mais aussi ses différences et ses relations avec les autres langages. Maintenant, regardez avec horreur la majorité qui abuse et déforme tout... comme la réponse d'andrew hare sur cette page...

93voto

Gumbo Points 279147

Système de dactylographie

  • Faiblement typée signifie que la conversion de type est effectuée implicitement en coulisses :

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

    Sur fortement typé vous devrez utiliser explicitement l'attribut chaîne de caractères à entier :

    (int) "12345" * 1 === 12345
  • Typage dynamique signifie qu'une variable peut contenir des valeurs de différents types de données :

    x = 12345;    // number
    x = "string"; // string

    Sur typée statiquement les langues une variable ne peut avoir que des valeurs du type pour lequel elle a été déclarée :

    int x = 12345; // binds x to the type int
    x = "string"   // error
  • Dactylographié signifie que la langue fait la distinction entre différents types tels que entier , float , chaîne de caractères , boolean et ainsi de suite. De plus, chaque opération est liée à des types spécifiques. Ainsi, vous ne pouvez pas diviser un entier par un chaîne de caractères .

    2 / "blah"  // produces NaN

    Sur non typée les langues l'opération de division entier par chaîne de caractères aurait pour conséquence de traiter les quatre premiers octets de chaîne de caractères comme entier et le résultat sera quelque chose de tout à fait inattendu :

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

1 votes

Mais je pense qu'il y a une contradiction dans la dernière déclaration. En JavaScript, le résultat d'une division entier-chaîne est bien défini, pour toute valeur de l'entier ou de la chaîne. C'est juste que ce n'est pas très utile !

0 votes

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

0 votes

@skurpur : Vous aviez complètement interverti les significations de Dynamic et Weak typing - corrigé cela.

50voto

Andrew Hare Points 159332

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

N'oubliez pas que JavaScript est également typée dynamiquement. Cette méthode de typage permet ce qui est connu sous le nom de "frappe de canard" .

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

2 votes

-1. Vous devez lire ce .

1 votes

-1 JS n'est pas typé. Le typage se réfère à l'acte de déclarer un type pour une variable, et non pas au fait qu'elle ait des types ou qu'elle passe de l'un à l'autre très bien.

5 votes

Cette réponse est bien meilleure, et bien plus précise, que la réponse la plus votée.

9voto

Darren Newton Points 1352

Selon l'auteur, JavaScript est également classé comme Typage dynamique . Wiki indique que les langages typés dynamiquement sont vérifiés au moment de l'exécution et non dans un compilateur, tandis que le typage faible fait référence à la possibilité de changer de type à la volée dans votre code. Donc oui, il est à la fois typés dynamiquement et faiblement typés.

9voto

Alex W Points 11502

Le problème ici, qui déroute beaucoup de programmeurs, est que les définitions de ce type ne sont pas normalisées quelque part. Le terme langage de programmation non typé est ambiguë. Est-ce que cela fait référence à une langue qui n'a pas types de données ou un langage qui est un lambda calculus variante non typée ?

JavaScript a un système de type et tous les domaines de ses fonctions accepteront tout var variable. 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 s'intéresse qu'à l'élément abstrait mis en œuvre par l'intermédiaire de la var qui ont été spécifiées par l'ECMAScript.

Dans le contexte du programmeur quotidien, et non du chercheur, le terme non typée est un terme mal choisi 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 les variables JavaScript mettent en œuvre leurs propres types de données abstraites :

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

donne

"string"

ECMAScript définit les types suivants pour le langage : 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/loosely typée (ou une combinaison de celles-ci), dans la mesure où JavaScript utilise type coercition dans certains cas, ce qui rend le type implicite car vous n'avez pas à spécifier explicitement le type de vos variables. Il est classé dans la catégorie des langages faiblement typés car, contrairement à certains langages qui font la distinction entre les flottants et les entiers, etc. number pour englober tous les nombres, et fait usage de la coercition de type mentionnée précédemment [Section 9 de la spécification ECMAScript].](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf) En revanche, un langage fortement typé 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 à typage statique et dynamique ne sont pas normalisées, mais elles font le plus souvent référence à la présence de certaines caractéristiques du langage. L'une d'entre elles est Vérification de type au moment de l'exécution ou ce que l'on appelle contrôle de type dynamique . Si vous avez utilisé JavaScript, vous savez déjà qu'il attend définitivement le moment de l'exécution pour vérifier les types, c'est pourquoi vous obtenez TypeError exceptions pendant l'exécution de votre code. Exemple ici

0 votes

Il ne s'agit pas d'un terme inapproprié, mais le contexte est important. stackoverflow.com/questions/9154388/

1 votes

@AndreasRossberg C'est absolument est un terme mal choisi. Ce à quoi vous faites référence, en votre lien d'auto-promotion sans vergogne est un système de type. La raison pour laquelle ce terme est mal choisi est qu'il est ambigu. La plupart des programmeurs pensent que type de données pas système de type quand ils entendent parler d'un langage non typé . Je pense Commentaire de Konrad Rudoph fait vraiment ressortir ce point.

0 votes

Je ne vois pas pourquoi vous trouvez "éhonté" 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 importait. Contrairement à la plainte de K. Rudolph, il existe des définitions parfaitement cohérentes et largement acceptées de "système de types" dans la littérature, et j'en ai cité une. Bien sûr, vous êtes libre de les trouver déroutantes dans votre contexte, mais cela n'en fait pas des "erreurs d'appellation".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X