Code JavaScript ne fonctionne pas

Le problème exposé dans ce sujet a été résolu.

J’essais pas d’avoir raison @Victor, je souhaite juste comprendre. Ici, l’histoire de const me laisse un peu perplexe. Je ne comprend pas trop.

Osimoquus

Est-ce que Javascript est ton premier langage ?

+0 -0

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.

Titi_Alone

On va difficilement être d’accord. T’es pas obligé de me croire, mais let s’utilise exceptionnellement, doit s’utiliser exceptionnellement. const est préférable dans une grande majorité des cas. Tiens par exemple dans zmarkdown, 15% des variables sont déclarées avec let, 85% avec const. Et si y’avait pas un for par-ci par-là, on serait à moins de 15%, mais on a affaire à du parsing où c’est bien plus impératif que fonctionnel.

Je pense que tu connais mal JavaScript. C’est pas grave du tout, hein. Par contre évite de dire trop de bêtises, ou alors dis des bêtises moins visibles.

Au final c’est pas grave du tout, comme je disais. En revanche, tente de bien comprendre la distinction entre [t]he value of a constant cannot change et [t]he value of a constant cannot change through re-assignment. C’est très important. Parce que c’est une question de valeur vs référence. Tu dois aussi comprendre que 3 est une valeur primitive alors que [] est un array-like object. Dans les 2 cas la variable est une référence à une valeur. Mais une valeur primitive est immuable. Ça signifie que tu ne peux pas la modifier. x = 3; x++ ne modifie pas 3. Après ça, 3 sera toujours 3.

+1 -0

On va difficilement être d’accord. T’es pas obligé de me croire, mais let s’utilise exceptionnellement, doit s’utiliser exceptionnellement. const est préférable dans une grande majorité des cas. Tiens par exemple dans zmarkdown, 15% des variables sont déclarées avec let, 85% avec const. Et si y’avait pas un for par-ci par-là, on serait à moins de 15%, mais on a affaire à du parsing où c’est bien plus impératif que fonctionnel.

victor

C’est exactement ce que je disait, on est pas loin des 20%, donc ; j’ai du mal à voir un code qui utilise beaucoup moins de stockage de nombres en direct, ou même de boucles.

J’ai fait beaucoup de Javascript (donc je connais bien le langage en général, mais pas spécialement ses recoins sombres), mais très peu d’ES6 (ES5? j’ai un doute quand à depuis quel spec ça existe), par contre, donc mes variables ont toujours été déclarées avec des var, et par constat j’ai effectivement un paquet de variables de nombre / string qui ne peuvent donc pas passer en const.

J’ai un question, vu que le HS semble toléré par l’auteur du sujet : pour la compatibilité navigateurs, est-elle suffisante en pratique pour utiliser let et const (CanIUse me dit que oui, a priori, mais est-ce quelqu’un l’a déjà déployé pour un projet conséquent) ?

+0 -0

C’est exactement ce que je disait, on est pas loin des 20%, donc ; j’ai du mal à voir un code qui utilise beaucoup moins de stockage de nombres en direct, ou même de boucles.

De manière générale j’évite les boucles, c’est moins compréhensible que map si tu collectes ou forEach si t’as des effets de bord.

très peu d’ES6 (ES5? j’ai un doute quand à depuis quel spec ça existe), par contre, donc mes variables ont toujours été déclarées avec des var, et par constat j’ai effectivement un paquet de variables de nombre / string qui ne peuvent donc pas passer en const.

Hardcoder des strings et des nombres pour ensuite les modifier, c’est pas une bonne idée. Tu peux hardcoder des valeurs si c’est des constantes, sinon c’est des magic numbers. (ES2015 quant à la spec)

J’ai un question, vu que le HS semble toléré par l’auteur du sujet : pour la compatibilité navigateurs, est-elle suffisante en pratique pour utiliser let et const (CanIUse me dit que oui, a priori, mais est-ce quelqu’un l’a déjà déployé pour un projet conséquent) ?

Titi_Alone

Ça dépend de ce que tu vises. Si tu fais un projet conséquent, c’est dommage de ne pas le rendre compatible avec un grand nombre de navigateurs/versions. D’autant que ça prend que 2 minutes.

+1 -0

@Victor, peux-tu m’expliquer, s’il-te-plaît, et je te remercie pour ton investissement jusqu’ici, pourquoi ce code affiche ’2’ pour le premier console.log lorsque je remplace z par y alors que ça ne fonctionne pas avec z?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function foo (x) {
  console.log(z);
  y = x;
  var z = y;
}

foo(2);

console.log(typeof x === 'undefined' ? 'undefined' : x);
console.log(typeof y === 'undefined' ? 'undefined' : y);
console.log(typeof z === 'undefined' ? 'undefined' : z);

Au premier ? Le premier est undefined. Réessaye

1
2
3
console.log(1, typeof x === 'undefined' ? 'undefined' : x);
console.log(2, typeof y === 'undefined' ? 'undefined' : y);
console.log(3, typeof z === 'undefined' ? 'undefined' : z);
+0 -0

@Victor, peux-tu m’expliquer, s’il-te-plaît, et je te remercie pour ton investissement jusqu’ici, pourquoi ce code affiche ’2’ pour le premier console.log lorsque je remplace z par y alors que ça ne fonctionne pas avec z?

Osimoquus

Quand tu remplaces z par y dans le premier console.log, ça doit planter parce que y n’est pas défini. Avec z en revanche ça donne undefined, var z ayant hoisté la déclaration de z au début du scope de foo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function foo (x) {
  console.log({z});
  y = x;
  var z = y;
}

foo(2);

console.log('x', typeof x === 'undefined' ? 'undefined' : x);
console.log('y', typeof y === 'undefined' ? 'undefined' : y);
console.log('z', typeof z === 'undefined' ? 'undefined' : z);

Tiens, regarde bien : https://imgur.com/a/ZNnysgD

+0 -0
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