Cette question porte sur Sémantique
Si je vous donne ces données : 12
quel est son type ? Vous n'avez aucun moyen de le savoir avec certitude. Il peut s'agir d'un entier, d'un flottant ou d'une chaîne de caractères. En ce sens, il s'agit bien de données "non typées".
Si je vous donne un langage imaginaire qui vous permet d'utiliser des opérateurs comme "ajouter", "soustraire" et "concaténer" sur ces données et sur d'autres données arbitraires, le "type" n'est pas très pertinent (pour mon langage imaginaire) (exemple : peut-être add(12, a)
rinde 109
qui est 12
plus la valeur ascii de a
).
Parlons de C une seconde. Le C vous permet de faire ce que vous voulez avec n'importe quel élément de données. Si vous utilisez une fonction qui prend deux uint
vous pouvez utiliser et passer ce que vous voulez - et les valeurs seront simplement interprétées comme des uint
s. Dans ce sens, C est "non typé" (si vous le traitez de cette manière).
Cependant - et pour en venir à la remarque de Brendan - si je vous disais que "Mon âge est 12
" - alors 12
a un type - au moins nous savons que c'est numérique. Avec le contexte tout a un type - quelle que soit la langue.
C'est pourquoi j'ai dit au début - votre question est une question de sémantique. Quelle est la signification de "non typé" ? Je pense que Brendan a mis le doigt sur le problème quand il a dit "pas de types statiques" - parce que c'est tout ce que cela peut signifier. Les humains classent naturellement les choses en types. Nous savons intuitivement qu'il y a quelque chose de fondamentalement différent entre une voiture et un singe - sans qu'on nous ait jamais appris à faire ces distinctions.
Pour en revenir à mon exemple du début, un langage qui "ne se soucie pas des types" (per-se) peut vous permettre d'"ajouter" un "âge" et un "nom" sans produire d'erreur de syntaxe... mais cela ne signifie pas que c'est une opération logiquement saine.
Javascript peut vous permettre de faire toutes sortes de choses folles sans les considérer comme des "erreurs". Cela ne signifie pas que ce que vous faites est logique. C'est au développeur d'y réfléchir.
Un système/langage qui n'applique pas la sécurité des types au moment de la compilation/construction/interprétation est-il "non typé" ou "dynamiquement typé" ?
Sémantique.
EDITAR
Je voulais ajouter quelque chose ici parce que certaines personnes semblent s'accrocher à "oui, mais Javascript a des "types"".
Dans mon commentaire sur la réponse de quelqu'un d'autre, j'ai dit :
En Javascript, je pourrais avoir des objets que j'ai construits pour être des "singes" et des objets que j'ai construits pour être des "humains" et certaines fonctions pourraient être conçues pour fonctionner uniquement sur les "humains", d'autres uniquement sur les "singes", et d'autres encore uniquement sur les "choses avec des bras". Que le langage ait été informé ou non de l'existence d'une catégorie d'objets telle que les "choses avec des bras" est aussi peu pertinent pour l'assemblage ("non typé") que pour Javascript ("dynamique"). C'est une question d'intégrité logique - et la seule erreur serait d'utiliser quelque chose qui n'a pas de bras avec cette méthode.
Donc, si vous considérez que Javascript a une certaine "notion de types" en interne - et, par conséquent, des "types dynamiques" - et que cela est en quelque sorte "distinctement différent d'un système non typé" - vous devriez voir dans l'exemple ci-dessus que toute "notion de types" qu'il a en interne n'est pas vraiment pertinente.
Pour effectuer la même opération avec C#, par exemple, j'aurais besoin d'une interface appelée ICreatureWithArms
ou quelque chose de similaire. Ce n'est pas le cas en Javascript, ni en C ou en ASM.
Il est clair que le fait que Javascript ait ou non une quelconque compréhension des "types" n'est pas pertinent.