
Envoyé par
sekaijin
ramener le faiblement typé au fait qu'on peut faire "1" + 1.
cela n'est qu'une question de définition de l'opérateur +
il est tout aussi faux de dire que JS est faiblement typé parce qu'on peut écrire ce genre d'expression.
Si j'écris add("1", 1) il devient fortement typé ?
Je partage avec vous que le faiblement typé n'est pas lié au fait de faire "1"+1, car c'est juste la définition. Seulement il n y a une différence entre
"1" + 1 et add("1", 1) , car d'abord ce qui est sûr c'est que la signature est soit add(Object,Object) ou s'il y a bien un surcharge de la méthode comme ça: add(String,Integer) et add(Integer,String) et add(String,String) ..., un des méthodes est bien choisit.
Ce qui est sûr add("1",1) te donnera sans doute 2, et non pas "11". Si je veux faire "11" on appel pas ça AJOUTER, c'est ce qui fait que dans ce cas on utilise la méthode concat()
Tout reste que moi je ne vois pas le vrai problème lorsqu'on travail avec des variables de type Object, tant que les normes préalablement définis sont respectés et pour moi il n'est pas question de nom de variables. Avant d'avancer reculons un peu pour voir: l'opérateur + par exemple en Java et JavaScript s'utilisent pour ajouter des nombres et concaténer, il y a une règle en commun c'est que tant qu'il y a une chaîne au milieu alors le résultat final sera une chaîne et tout ce qui est avant la chaîne sera évalué et tout ce qui est après la chaîne s'il n a pas de parenthèse et ben il sera concaténé.
C'est pour cela que j'arrive à écrire des trucs comme ça en Java:
1 2 3 4 5 6 7 8 9 10 11 12
| Object a=1+2;//a=3
a="1"+"2";//a=="12"
a="1"+2; //a=="12"
a=1+2+"3";//a==(1+2)+"3"=="33"
a=1-2+"3";//a==(1-2)+"3"=="-13"
a="1"+2+3;//a=="12"+3=="123"
a="1"+(2-3);//a=="1-1"
a=1+2+"3"+4;//a==(1+2)+"34"=="334"
a=new String("2")+new String("3");//b=="23"
a=new Integer("2")+new String("3");//b=="23"
a=new Integer("2")+new Integer(3);//b==new Integer(5)
a=new Integer("3")-new Integer("2")+new String("3");//b=="23" |
Mais ça s’arrête là vu que l'opérateur + a été surchargé pour la concaténation, du coup il fallait un certains nombre de règles à appliquer, ainsi si je veux faire "1"-2 ou ça a="1"+2-3;, il va refusé, c'est une erreur de compilation car aucune règle d'utilisation de l’opérateur - pour des chaîne, on a surchargé + à la limite pour faciliter des milliers de taches répétitives de concaténation, et qu'enfin ça vous donnera toujours des chaines, mais il est hors de question de faire des calculs sur des chaines. On pourrait utiliser le <.> comme en php, mais le jeu serait le même.
Un tableau de caractère ça reste un tableau de caractère, si vous êtes sûr ce que vous voulez convertissez le. Ce qui est important ici c'est que l'exception a été donné seulement à l'objet de type String, et dés que ce dernier se trouve dans l’instruction alors il sera obligatoirement le type du résultat final on sort carrément du cadre de calcul, ça reste de la concaténation et le type est déjà défini et connu comme type final. D'autres objets n'ont pas de places ici.
Mais en JavaScript ils mélangent tout à part le fait de permettre des conversion implicites des chaines, mais tu peux tout mélanger à la fois faire des calculs sur n'importe quoi, un truc comme ça par exemple:
var a=new Array()+new Number(4)-new String("2")+new Boolean(true); a==3 
var b=12/['2']+['2','3'];a=="62,3"
Du coup, au delà des règles fixés en cas de présence de chaîne, JavaScript devient un peu bordélique en typage.
En plus de ça si je me permet de mettre de fausses données il va seulement me retourner NaN sans me dire que ce qui lui a causé tout ça, il est incapable de dire "Eh je n'arrive pas à convertir un tel en tel, ou calculer tel avec tel" non, il se tais et retourne NaN et si c'est dans des milliers de lignes de code: un jeux par exemple où on manipule beaucoup les nombres c'est fini toute la journée va passer là, car il ne te dira rien. Ça bug c'est tout.
Du coup si en Java je fais
a=new Integer("b")+new Integer("2"); ça va compiler mais, quand ça ne va pas marcher avec le b quand il voudra convertir, tu saura là où est l'erreur et même la ligne exacte et toute la pile des méthodes infectés.
prenez un langage considéré comme fortement type genre C++ ou Java
développez en utilisant uniquement des variables et des paramètres de fonction de type void& ou Object.
Non, car ce qui est après la variable de type Object est évalué et enfin un objet est retourné à la fin, et mis dans Object, certes si je teste son type je saurais de quel type il s'agit
En JavaScript je peux faire:
1 2 3
| var a=2;
var b=3
var c=a+b;//c==5 |
Mais je ne peux pas faire en Java ceci:
1 2 3
| Object a=2;
Object b=3;
Object c=a+b;//ERREUR DE COMPILATION |
Le compilateur dira qu'il n y a pas de calcul sur des Objet, le typage fort oblige, je dois faire ceci pour que ça marche:
Object c=((Integer)a)+((Integer)b); c==new Integer(5)
J'ai vu dans un de tes messages ici, faire une comparaison sur entre JavaScript et Java en montrant comme quoi Java oblige d'ajouter une variable de plus c'était ça:

Envoyé par
sekaijin
1 2 3 4 5
| Object obj = myMap.get("truc");
if (obj instenceof Machin) {
Machin truc = (Machin)obj;
truc.myMethod();
} |
et
1 2 3 4
| var truc = myMap.get("truc");
if (truc instanceof Machin) {
truc.myMethod();
} |
Je tiens à rappeler que c'est juste toi qui a ajouter cette variable, mais je ne suis obligé de l'ajouter, juste un casting de plus, je peux faire tout court en Java:
1 2 3 4
| Object truc = myMap.get("truc");
if (truc instenceof Machin) {
((Machin)truc).myMethod();
} |
Partager