• le `+` a trois utilités : si les deux termes sont des nombres, alors il les additionne, si les deux termes ne sont pas des nombre il sert à concaténer (rassembler) deux chaines de caractères. Dans les autres cas il permet de convertir le terme qu'il précède en Nombre.
• Un Objet converti en String sans méthode `toString` défini manuellement renverra `"[object Object]"`.
• Quand un tableau `[ ]` est converti en chaine de caractère, chacun de ces éléments sera séparé par une `,` ainsi `[1, 'abc', ''].toString()` donnera `"1,abc,"`. Pour rappel, un Array est un Objet un peu particulier, et qui défini la méthode `toString` d'une façon similaire à : `Array.prototype.toString = function () { this.join(",") }`
• Si une ligne commence par `{` alors c'est considéré comme étant un block (non un objet) qui se termine au prochain `}`
• Converti au même type (typecasted) : 0, "", false, undefined, null sont égaux
En partant de là :
• `[] + []` => "" – (chaine vide) car comme les deux termes ne sont pas des nombres, le PLUS essaie de convertir les deux termes en String, et un Array vide converti en string donne une string vide. On se retrouve donc avec `"" + ""` et la concaténation de deux String vide donne bien une String vide cad `""`
• `[] + {}` => "[object Object]" – Même réflection : `"" + "[object Object]"` donne bien `"[object Object]`
• `{} + []` => 0 – Ici la ligne commence par un block qui ne fait rien et se termine immédiatement, donc `{}` est ignoré, ce qui nous laisse `+[]`, ici le plus précède un terme qui n'est pas un nombre, il essai donc de le convertir en nombre, sauf qu'on ne peut généralement convertir q'une String en nombre. Il est donc déjà converti en String `""`, puis une String vide typecasted est égale à 0, donc la conversion d'un tableau vide en nombre donne 0.
• `{} + {}` => NaN – Même chose ici, cela donne `+{}` et essai de convertir un objet en nombre, ce qui équivaut à le convertir d'abord en String `+"[object Object]"` puis en nombre, sauf que cette String ne contient pas de nombre, donc => Not-A-Number aka `NaN`
• Array(16) => ,,,,,,,,,,, – Son interpréteur converti en String tout ce qui lui est passé avant de l'afficher, ainsi comme vu plus haut, un tableau vide de 16 élément, retourne bien 15 virgules.
• Array(16).join("wat") => watwatwat... – Totalement normal
• Array(16).join("wat" + 1) => wat1wat1wa... – Totalement normal, un des termes autour du plus est une string, le deuxième sera donc converti en string avant d'être concatén
• Array(16).join("wat" - 1) => NaNNaNNa.... – Le `-` ne fonctionne qu'avec des nombre, il essaie donc de convertir les deux termes en Nombre, comme "wat" n'est pas un nombre, c'est donc converti en `NaN` et `NaN - 1` c'est aussi `NaN`.
Merci ! Enfin quelqu'un qui sait de quoi il parle !
J'avais envie de hurler durant toute la vidéo, clairement le gars n'aime pas Javascript et ne connait pas Javascript.
Après ça m'a fait rire quand même, mais ça aurait été intéressant qu'il explique pourquoi !
---
(c'est chiant la limite de 25 lignes pour un commentaire).
Pour Ruby :
* Lorsqu'une variable est assignée elle est implicitement assignée à `nil` en tout premier lieu.
Ainsi lorsqu'on fait `a = b`, alors ruby fait :
`a = nil; a = b`, sauf que b n'existe pas donc : erreur
Par contre pour `a =a` :
`a = nil; a = a`, cela fonctionne car a est initialisé avec une valeur `nil`, donc au final `a => nil`
Pour le méthode missing, c'est simplement que le premier membre de la phrase est considéré comme un appel de fonction, et le reste sont des paramètres. En Ruby, un truc top c'est de pouvoir surcharger ce qu'il se passe quand une fonction n'existe pas, et c'est ce qu'on fait ici, on dit simplement d'écrire tous les arguments quand on appelle une fonction qui n'existe pas. Fun mais pas exceptionnel, et à ne jamais utiliser de cette façon.
Je me suis mal expliqué, j'ai donné l'exemple pour `b`, en fait ruby assigne automatiquement à `nil` avant toute première ASSIGNATION (pas utilisation), c'est une sorte de déclaration. Quand tu utilises `a` il n'est pas déclaré, donc erreur. Par contre quand tu fais une assignation avec `a = xxxx`, alors `a` est tout d'abord déclaré à `nil` avant d'être assigné avec `xxxx`. Je ne sais pas si c'est plus clair.
Si on sait ce qu'on fait, ce côté est intéressant, un langage prototypé a pas mal d'avantages, tout dépend du besoin. Ça essaie d'évoluer dans le bon sens, notamment avec l'essor de TypeScript qui amène le typage au langage, et permet le fail-early.
"si on sait ce qu'on fait", ok donc on va sur le terrain de la fiction :) A mon sens c'est du même accabit que "les tests c'est pour ceux qui savent pas coder" ou encore ceux qui mettent "langages connus [...] UML" sur leur CV :)
Mais bon, pour être honnete je suis dev Java et ce débat on l'a au taff avec les devs Front qui font du tres bon boulot en JS & TS, meme si c'est pas grace a ces "avantages" que le JS revient sur le devant de la scène amha, mais plutôt grace a son comportement simili asynchrone.
Ahah pour les tests !
D'ailleurs Kotlin me donnerait "presque" envie de refaire du Java :)
Le pseudo asynchrone de Javascript, est simplement fait de la même façon que dans beaucoup de programme non javascript (`while(1)`). Sauf que l'Event Loop est la base de la techno, et donc transparente. Le vrai asynchrone n'existe pas vraiment, même avec les system interupts de toute façon.
BarneyGumbles Lombric Shaolin
Zap Vermisseau
i = float("9e999")
s = [str(-i+i).capitalize()]*9
print("%s Batman!" % ''.join(s))
Tronix117 Vermisseau
En Javascript :
• le `+` a trois utilités : si les deux termes sont des nombres, alors il les additionne, si les deux termes ne sont pas des nombre il sert à concaténer (rassembler) deux chaines de caractères. Dans les autres cas il permet de convertir le terme qu'il précède en Nombre.
• Un Objet converti en String sans méthode `toString` défini manuellement renverra `"[object Object]"`.
• Quand un tableau `[ ]` est converti en chaine de caractère, chacun de ces éléments sera séparé par une `,` ainsi `[1, 'abc', ''].toString()` donnera `"1,abc,"`. Pour rappel, un Array est un Objet un peu particulier, et qui défini la méthode `toString` d'une façon similaire à : `Array.prototype.toString = function () { this.join(",") }`
• Si une ligne commence par `{` alors c'est considéré comme étant un block (non un objet) qui se termine au prochain `}`
• Converti au même type (typecasted) : 0, "", false, undefined, null sont égaux
En partant de là :
• `[] + []` => "" – (chaine vide) car comme les deux termes ne sont pas des nombres, le PLUS essaie de convertir les deux termes en String, et un Array vide converti en string donne une string vide. On se retrouve donc avec `"" + ""` et la concaténation de deux String vide donne bien une String vide cad `""`
• `[] + {}` => "[object Object]" – Même réflection : `"" + "[object Object]"` donne bien `"[object Object]`
• `{} + []` => 0 – Ici la ligne commence par un block qui ne fait rien et se termine immédiatement, donc `{}` est ignoré, ce qui nous laisse `+[]`, ici le plus précède un terme qui n'est pas un nombre, il essai donc de le convertir en nombre, sauf qu'on ne peut généralement convertir q'une String en nombre. Il est donc déjà converti en String `""`, puis une String vide typecasted est égale à 0, donc la conversion d'un tableau vide en nombre donne 0.
• `{} + {}` => NaN – Même chose ici, cela donne `+{}` et essai de convertir un objet en nombre, ce qui équivaut à le convertir d'abord en String `+"[object Object]"` puis en nombre, sauf que cette String ne contient pas de nombre, donc => Not-A-Number aka `NaN`
• Array(16) => ,,,,,,,,,,, – Son interpréteur converti en String tout ce qui lui est passé avant de l'afficher, ainsi comme vu plus haut, un tableau vide de 16 élément, retourne bien 15 virgules.
• Array(16).join("wat") => watwatwat... – Totalement normal
• Array(16).join("wat" + 1) => wat1wat1wa... – Totalement normal, un des termes autour du plus est une string, le deuxième sera donc converti en string avant d'être concatén
• Array(16).join("wat" - 1) => NaNNaNNa.... – Le `-` ne fonctionne qu'avec des nombre, il essaie donc de convertir les deux termes en Nombre, comme "wat" n'est pas un nombre, c'est donc converti en `NaN` et `NaN - 1` c'est aussi `NaN`.
glurp En réponse à Tronix117 LoMBriK addict !
J'avais envie de hurler durant toute la vidéo, clairement le gars n'aime pas Javascript et ne connait pas Javascript.
Tronix117 En réponse à glurp Vermisseau
---
(c'est chiant la limite de 25 lignes pour un commentaire).
Pour Ruby :
* Lorsqu'une variable est assignée elle est implicitement assignée à `nil` en tout premier lieu.
Ainsi lorsqu'on fait `a = b`, alors ruby fait :
`a = nil; a = b`, sauf que b n'existe pas donc : erreur
Par contre pour `a =a` :
`a = nil; a = a`, cela fonctionne car a est initialisé avec une valeur `nil`, donc au final `a => nil`
Pour le méthode missing, c'est simplement que le premier membre de la phrase est considéré comme un appel de fonction, et le reste sont des paramètres. En Ruby, un truc top c'est de pouvoir surcharger ce qu'il se passe quand une fonction n'existe pas, et c'est ce qu'on fait ici, on dit simplement d'écrire tous les arguments quand on appelle une fonction qui n'existe pas. Fun mais pas exceptionnel, et à ne jamais utiliser de cette façon.
Je crois que j'ai tout couvert ;)
AthranZara En réponse à Tronix117 Vermisseau
Tronix117 En réponse à AthranZara Vermisseau
Maurice En réponse à Tronix117 Versus
AthranZara En réponse à Tronix117 Vermisseau
Je connais les raisons de 1 + "1" != "1" + 1 mais ca n'empeche que c'est quand meme chiant
Tronix117 En réponse à AthranZara Vermisseau
AthranZara En réponse à Tronix117 Vermisseau
Mais bon, pour être honnete je suis dev Java et ce débat on l'a au taff avec les devs Front qui font du tres bon boulot en JS & TS, meme si c'est pas grace a ces "avantages" que le JS revient sur le devant de la scène amha, mais plutôt grace a son comportement simili asynchrone.
Tronix117 En réponse à AthranZara Vermisseau
D'ailleurs Kotlin me donnerait "presque" envie de refaire du Java :)
Le pseudo asynchrone de Javascript, est simplement fait de la même façon que dans beaucoup de programme non javascript (`while(1)`). Sauf que l'Event Loop est la base de la techno, et donc transparente. Le vrai asynchrone n'existe pas vraiment, même avec les system interupts de toute façon.
Nap Vermisseau
Frankfurt Lombric Shaolin
null == 0 (false)
null < 0 (false)
null < = 0 (true) (sans l'espace entre < et =)
https://stackov...-but-not-null-0