Qu’est-ce qui est affiché par ce programme ? Pourquoi ?
Que se passe-t-il si tu mets y au lieu de z à la ligne 2 ? Pourquoi ça fait ça avec y mais pas avec z ?
Comment évaluer ton résultat avec mon petit puzzle :
Si tu fais tout juste sans tester, bravo, t’as bien pigé pourquoi ne pas déclarer tes variables est démoniaque et pourquoi var est une atrocité. Et donc tu ne feras jamais ni l’un ni l’autre.
Si t’as pas fait tout juste, bravo, t’as bien pigé pourquoi ne pas déclarer tes variables ou utiliser var te fera écrire du code que tu ne comprendras pas. Et comme t’as pas envie de pas comprendre les programmes que tu écris, tu ne feras jamais ni l’un ni l’autre.
Le scoping des variables en python est pété, mais moins pété que JavaScript. ↩
Que dois-je écrire pour déclarer les variables dans ce cas?
Si j’ai bien compris, le premier alert me renvoi undefined parce que la variable n’est pas déclarée, le second undefined car c’est simplement un paramètre qui n’existe pas en dehors de la fonction, le troisième renvoi 2, tout simplement, et le dernier… Je n’arrive pas à comprendre. Cela me renvoi undefined parce que la variable n’est pas déclarée en dehors de foo()?
Comme je l’ai dit plusieurs fois dans mes précédents messages dans ce sujet : déclare les variables avec const, ou parfois let. Mais presque toujours const.
N’utilise jamais var. Déclare toutes tes variables, ne jamais, jamais faire x = truc sans avoir déclaré x ou sans déclarer x.
Je viens de lire la doc de const, je pensais que const en JavaScript permettait de faire une variable à valeur fixe comme la plupart des langages avec les constantes. Ce qui explique mon précédent message "ironie ou lapsus ?".
Const permet juste d’éviter de ne pas autoriser une deuxième déclaration après ? Je ne comprends pas pourquoi il l’autorise dans let…
A-312, const c’est référence constante, pas valeur constante.
1
2
3
4
5
6
7
8
9
constx=[]consty={}x.push(12)y.foo=xx.push(72)console.log(y.foo[1]===72)// truex=1// TypeError: Assignment to constant variable.y=1// TypeError: Assignment to constant variable.
1
2
3
4
5
6
letx=17letyx=11y=12x++console.log(x===y)// true
Tu comprends ? Tu sembles faire pas mal de JS à en juger par ton activité sur les sujets qui parlent de JS, je te recommande de bien apprendre et comprendre comment déclarer et utiliser des variables, ça t’aidera.
D’après cette page, le hissage en js ne fonctionne que pour les déclaration et pas pour les initialisations.
Aussi, si j’utilise const pour déclarer, je ne pourrais modifier la valeur de ma variable. Et si j’utilise let et que je déclare dans un bloc d’instruction ma variable ne sera pas déclarée ailleurs, c’est ça?
En fait, je ne vois toujours pas vraiment pourquoi ne pas utiliser var, même avec ton puzzle.
Et si j’utilise let et que je déclare dans un bloc d’instruction ma variable ne sera pas déclarée ailleurs, c’est ça?
Exactement.
Parce que var n’existe plus que pour que les vieux programmes fonctionnent.
var n’est pas scopé dans un block.
Tout à fait valide et dangereux :
1
2
varx=1;varx='salut';
Bref tu fais ce que tu veux, continue à utiliser var si tu veux, tu perdras un temps fou à débugger des problèmes absurdes mais tu fais ce que tu veux.
Ah oui, j’ai compris la nuance pour const. Donc j’utilise const tout le temps et si je veux modifier manuellement la valeur de ma variable, j’utilise let?
Si par exemple je veux échanger la valeur de deux variables?
PS : Je suis désolé de t’harceler, mais c’est pas évident quand tu débute.
Non non : utilise const tout le temps, ça empêche pas de modifier la valeur.
C’est comme si tu nommes ton tiroir "Robert". Sans changer quoi que ce soit au fait que ton tiroir se nomme Robert, tu peux en modifier le contenu. La seule règle c’est que tu changes pas le prénom d’un truc et que t’as pas plusieurs trucs qui ont le même nom.
Donc si demain tu décides qu’en fait Robert c’est ton vélo, là non t’as un problème : Robert c’est un tiroir pas un vélo.
Non, une constante n’est pas censé changer de valeur, en pratique on peux (parfois, pas dans les navigateurs corrects), mais ce n’est pas prévu :
Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can’t be redeclared.
Tu n’as pas compris ce que j’ai dit. Ce que ton code fait, c’est donner le nom a à l’objet 4. L’objet 3 est déjà assigné à a. Tu n’as donc pas le droit. Reprends mon exemple de tiroir et remplace Robert par a, tiroir par 3, vélo par 4, si ça t’aide.
La référence doit être constante, la valeur elle peut changer. C’est pas une question de navigateur, Titi_Alone, tu te plantes. Si a fait référence à 3, plus tard a ne peut pas faire référence à 4. La référence est constante. 4 n’est pas une valeur modifiée de 3, c’est un autre objet.
(Ce n’est pas dans mon habitude de dériver le sujet lorsque l’OP n’a pas encore résolut son problème mais je me permets encore un petit "HS". J’espère que ça ne te dérange pas Osimoquus)
Il y a plusieurs facteurs :
J’ai dû mal à me tenir à jour sur le JavaScript (je l’ai dis sur un sujet où tu participais, il me semble que c’était pour String.endWith()). Du mal, dans le sens que j’ai aucun site de confiance à suivre donc bon… Et de ceux que j’ai survolé, la majorité conseillait d’utiliser let et non const. Je n’ai pas trop me temps de multiplier mes sources.
Je pars du principe à tort que j’ai toujours fais sans const. Mon code fonctionne et que je n’ai jamais eu de problème spécifique avec var et les scopes de variable.
Je maintiens plusieurs scripts qui utilisent var, et je n’ai pas le temps à essayer de remplacer par const car j’ai peur d’avoir des erreurs avec la modification de scope. Et de perdre du temps pour rien.
Mais maintenant que j’ai lu ce sujet, je vais prendre l’habitude d’utiliser const/let. Pour mes nouvelles lignes de code.
Ok, donc c’est inutilisable dans au moins 20% des cas (grosso-merdo), on est bien d’accord ; c’est bon pour stocker des objets (EDIT : ou des arrays, tu vois le truc), pas pour autre chose.
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte