Cette question concerne la sémantique
Si je vous donne ces données: 12
quel est son type? Vous n'avez aucun moyen de le savoir avec certitude. Peut être un entier - peut être un flottant - peut être une chaîne. En ce sens, ce sont des données très "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" est quelque peu hors de propos (pour mon langage imaginaire) (exemple : peut-être add(12, a)
donne 109
ce qui est 12
plus la valeur ascii de a
).
Parlons C pendant une seconde. C vous permet à peu près de faire ce que vous voulez avec n'importe quelle donnée arbitraire. Si vous utilisez une fonction qui prend deux uint
s - vous pouvez lancer et passer tout ce que vous voulez - et les valeurs seront simplement interprétées comme uint
s. En ce sens, C est "non typé" (si vous le traitez de cette manière).
Cependant - et pour en venir au point 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 frappé dans le mille 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 jamais apprendre à faire ces distinctions.
Revenons à mon exemple du début - un langage qui "ne se soucie pas des types" (en soi) peut vous permettre "d'ajouter" un "âge" et un "nom" sans produire d'erreur de syntaxe ... mais cela ne veut pas dire que c'est une opération logique.
Javascript peut vous permettre de faire toutes sortes de choses folles sans les considérer comme des «erreurs». Cela ne veut pas dire que ce que vous faites est logique. C'est au développeur de travailler.
Un système / langage qui n'applique pas la sécurité de type au moment de la compilation / construction / interprétation est-il "non typé" ou "typé dynamiquement"?
Sémantique.
ÉDITER
Je voulais ajouter quelque chose ici parce que certaines personnes semblent être rattrapées par "ouais, mais Javascript a quelques" 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 des "humains", d'autres sur des "singes", et encore d'autres sur seulement "Things With Arms". Que le langage ait déjà été dit ou non qu'il existe une catégorie d'objets telle que «choses avec des bras» est aussi hors de propos pour l'assemblage («non typé») que pour Javascript («dynamique»). Tout est une question d'intégrité logique - et la seule erreur serait d'utiliser quelque chose qui n'a pas d'armes 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 pensez que c'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 est vraiment hors de propos.
Pour effectuer la même opération avec C #, par exemple, J'AI BESOIN d'une interface appelée ICreatureWithArms
ou quelque chose de similaire. Pas si en Javascript - pas si en C ou ASM.
De toute évidence, le fait que Javascript comprenne ou non les «types» n'a aucune importance.