
Envoyé par
sekaijin
C++ qui est communément admi comme fortement typé permet d'écrire
a=new Array()+new Number(4)-new String("2")+new Boolean(true)
. cela ne fait pas de C++ un langage faiblement typé.
Impossible de faire un truc pareil en C++, les opérateurs surchargés s'appliquent tout simplement sur les références des vers les objets, mais pas sur les objets elles même ou non plus sur des pointeurs comme ça, l'opérateur new en C++ fait une instanciation dynamique et retourne un pointeur sur l'objet.
Et l'instanciation normale ne se fait même pas comme en Java et JavaScript. Mais comme MaClass objet(pramsduconstructeur); du coup impossible d'appliquer directement un opérateur directement sur l'objet qu'on vient de créer. On peut à la rigueur accéder en faisant faire appel aux références des objets comme ça:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class A {int a;
public:
A(int b){
this->a=b;
};
A operator +(A a){
this->a=this->a+a.a;
return *this;
}
int getVal(){
return a;}
void affiche(ostream &flux) const{
flux<<a<<"\n";
};
};
std::ostream &operator<<(std::ostream &flux, A const& a)
{
a.affiche(flux) ;
return flux;
} |
Ainsi dans Main je pourrais faire appel au références sur les objets
1 2 3
| A a(2);A b(3);
a=(*new A(3))+(*new A(3));
cout<<"a="<<a; |
Le plus important ici, c'est qu'il doit exister une définition préalable de l’opérateur + ce qui n'a rien n'avoir avec la définition standard du lagunage, donc un contrat qu'on définit entre les références, et l'opérateur joue juste le rôle d'un simple nom de méthode qu'on va appeler.
Mais pourquoi JavaScript se donne le droit d'appeler des opérateurs sur d'autres objets sémantiquement aucun sens, pas de contrat défini, sans se soucier des dangers qui peuvent exister alors que ça donne des codes dépourvus de toute sens, à quoi ça sert vraiment de définir des types pour nos objets s'ils peuvent être placés n'importe où.
Quand je définis l'opérateur moi même les gens saurons que j'ai changé ce qui se passe dans le normale. En JS on ne comprend rien du tout. Des appels statiques des opérateur sur toute chose.
En javaScript tout comme en Java lorsque tu crée un Objet il a un certain type et celui-ci ne changera jamais jusqu'à sa destruction
Mais il faut bien dire l'objet indépendamment de là où il est stocké, car déjà l'objet en soi je ne peux pas le modifier c'est comme vouloir faire:
new Array()=12 ou faire même si je veux écraser l'ancien new Array(1,2,3)=new Array(0,1);, il va refuser
Ici il sait dire "Ah cette assignation n'est pas autorisée", et ben tout simplement par ce que ce sont des objet et c'est le moment de la création des objets eux même et pourtant il permet de faire le bordel en manipulation.
Par contre en C++ vu que l'exemple précédant je travaillais comme avec des variables, je peux faire facilement comme ça:
cout<<"a="<<(*new A(3)=*new A(5));
En 2e lieu je crois qu'on mélange dans le débat, mais qui vous a dis que typage dynamique est synonyme de faiblement typé c'est juste les variables qui ne sont pas typés statiquement, mais le problème en JavaScript se pose sur les contenus des variables et des objets, comment les moteurs JavaScript sont aussi con de ne pas pourvoir dire que tout ceci n'a pas de sens:
a=new Array()+new Number(4)-new String("2")+new Boolean(true)

Envoyé par
sekaijin
JavaScript est assez intelligent pour que tu n'ai pas à écrire le cast
Je n'appel pas ça de l’intelligence mais l'inexistence de typage lui oblige, et gare à nous au contenu, JavaScript n'est pas responsable.
Moi je vois là, une faiblesse car au préalable JavaScript, nous dit la règle suivante: "Moi JavaScript: je ne m'intéresse pas aux types des données que vous me fournissez, moi j'évalue tout juste les contenus que je trouve dans les variables ou placés explicitement dans les instructions et puis je regarde l'opérateur, alors si j'arrive à vous retourner quelque chose tant mieux pour vous, sinon je vais vous insérer ou retourner un bon NaN dans vos résultats et tant pis pour vous, débrouillez vous je ne suis pas là pour faire du social".
Alors là je dois suivre le jeu en tant que développeur aussi JavaScript et je dis ok ok JS ne se soucie pas alors je vais pouvoir faire tout ce que je veux, mais si je me trompe un jour j'aurais un bon
et je ne saurais jamais où est tel.
Moi si on me dit d'écrire un compilateur de JavaScript je serais très content car le jeu est très simple je ne suis pas obligé de dire que quoi que se soit ni lever une exception.
Ce me casse la tête c'est qu'en JavsScript je ne peux même pas tester si ce foutu NaN existe ou pas avant de décider que si l'instruction a pu en sa totalité la retourner, car en toute malhonnêteté intellectuelle JS a l’audace de considérer NaN comme "A" ou 2. Ce qui fait que entre le debut de l'instruction et le point virgule il peut y avoir un NaN quelque part c'est simple il va l'insérer dans le résultat.
Un petite exemple si l'utilisateur aura à insérer des nombres à virgule ou moi même j'ai oublié dans une variable de type string contenant le nombre venant du serveur ou en entrée, donc si je me trompe je fais b="2,5" au lieu de b="2.5" et puis je fais
1 2
| b="2,5";
var result="VAL"+12/b+2*2+"FINAL"; |
C'est ça ce que vous appelez détecter une erreur de type, au lieu de me déclencher une erreur, mon utilisateur a devant lui un bon NaN inséré dans le résultat.
Il n y a pas de conversion implicite ici, il y a de la concaténation combien de fois on va vous répéter la même chose, si je fais:
String a = "test : " + 1;
où est la conversion implicite, Java permet de faire pour les types primitifs et ça s’arrête là.
Une conversion implicite c'est qu'on pusse faire des calculs sur des chaines, ÇA N'EXISTE PAS EN JAVA
Je ne peux pas faire
Mais quand tu dis ceci:
a= Math.sin("t");si cela me retourne NaN (Not a Number)
Ais-je détecté que le type est incorrect ?
Mais que ce que tu veux qu'il fasse le "t"?
Dis moi? La première règle en programmation "TOUTE INSTRUCTION DOIT RETOURNER QUELQUE CHOSE" ou moins rompre le programme. NaN est une valeur, je peux faire NaN.toString()=="NaN", contrairement à undefinned que je ne peux pas faire undefined.toString(). Et JavaScript ne renvoi quelque chose de type undefinded, sauf une pour variable non initialisés ou qui sont vides si là ils pointaient est détruit. POINT BARRE
On n'appelle pas ça détecter une erreur, il ne sait rien faire avec le "t" donc il se débrouille pour renvoyer une valeur moche et polluer mon programme
Détecter une erreur c'est le signaler, rompre le programme pour ces irrégularités de type ou au moins un warning, quelque chose comme ça mais pas le silence. Une raison de plus que je serais le premier candidat pour l’écriture d'un moteur de JavaScript, comme le jeu est aussi simple que ça.
dans un tel exemple les référence a b et c ne change jamais de nature. un copilateur type Java pourait donc vérifier les type et ne trouverait aucune erreur de type.
pourtant l'objet à changé de nature en cours de route.
Je m'excuse mais là à présent vous commencez à dire des chose que je ne comprend pas du tout.
Tu reviens sur la même discussion qu'une VARIABLE DE TYPE OBJET PEUT CHANGER DE RÉFÉRENCE VERS UN AUTRE OBJET EN COURS ROUTE, et non pas l'objet avec un type déjà défini ou avec lequel on a assigné une valeur. Est ce que ça à changer de type en cours de route, il est resté et restera toujours de type Object jusqu'a la fin du programme. Mais essaye de Changer c ou b pour voir 
Déjà je me demande quelque langage que si je fais a.toString(); alors a devient de type String? C'est quel langage ça, c'est complètement ABSURDE et IMPOSSIBLE à moins que toString() ne soit pas une méthode d'instance, une sorte de méthode static surchargé syntaxiquement comme les méthodes d’extension de C#. Comment une méthode d'instance appeler sur un objet, va détruire l'instance elle même et faire appel à une autre instance d'un autre type et l'affecter à cette variable elle même. C'est de la magie ça. 
Une instruction comme ça this=new MaClass() c'est peut être chez les extra-terrestres. Si tu me dit qu'on fait a=a.toString(), on écrase l'ancien pour la nouvelle valeur j'aurais comprendre, ce qui fait que b pointe sur NULL car l'ancien objet est complètement détruit, donc b devient comme une variable non instancié.
Dans toutes les circonstances les deux points ne sont pas respectés par JavaScript. Et comme j'ai dis que l'opérateur de concaténation en Java par exemple à été bien défini pour prendre les en 2e opérandes les objet de type primitifs, qu'il soit définis avec les type primitif en soi ou les class représentant les types primitifs et ça s’arrête là. PAS DE CONVERSION IMPLICITE
Benjamin C. Pierce n'est pas un envoyé de Dieu, c'est son avis et ça s’arrête là, il y a pas un illuminé en programmation pour orienter les avis du monde.
Dans tout ça si le langage dont les concepteurs n'ont pas su fortifier le concept de type pour me m'aider moi développeur a éviter les bug d'ordre type sans que je sois obligé à faire des logs partout dans mon code mais il ne m'assure pas que les erreurs de types seront signalés que ça soit en compilation ou interprétation, alors il est faiblement typé. Même si vous criez mille fois qu'il ne l'est pas.
Je continuerais à codé pour JavaScript mais dans ma conscience c'est un mal nécessaire.
Partager