OK merci !
Un nouvel exercice est disponible ICI pour mettre à profit ce week-end de Pâques![]()
Merci.
Cet exercice m'a fait réfléchir... Je me suis aperçu qu'on ne pouvait pas modifier une string même en JS !!!
Le principe c'est :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 var chaine = "abc"; console.log(chaine);// affiche --> abc chaine += "d"; console.log(chaine);// affiche --> abcd
Oui c'est finalement ce que j'ai fait en troisième solution (après celle des tableaux et de la fonction repeat).
Je ne sais pas comment cela se passe en JS (je me le demande d'ailleurs) mais en Java une instruction comme "chaine += "d";" ne modifie pas l'objet "chaine", un autre objet string est instancié... Je crois que c'est pour cela que certains utilise un stringbuffer...
Je viens de le faire en Java :
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class Sapin { public static void main(String[] args) { int leavesHeight = 5; int trunkHeight = 4; int trunkWidth = 3; String line = "" , sapin = ""; int nbrSpace ; int nbrCroix ; int tailleLigne ; //Le feuillage... for(int i= 0; i<leavesHeight; i++){ nbrSpace = leavesHeight-1-i ; nbrCroix = 2*i + 1 ; tailleLigne = nbrSpace + nbrCroix ; for(int j=0; j<nbrSpace; j++){ line += " "; } for(int j=nbrSpace; j<tailleLigne; j++){ line += "*"; } sapin += line +"\n"; line = ""; } nbrSpace = leavesHeight-1-(trunkWidth-1)/2; nbrCroix = trunkWidth ; tailleLigne = nbrSpace + nbrCroix ; for(int j=0; j<nbrSpace; j++) line += " "; for(int j=nbrSpace; j<tailleLigne; j++) line += "*"; for(int i=0; i<trunkHeight; i++) sapin += line +"\n"; System.out.println(sapin); } }
@Beginner,
Non en JavaScript il n'y a pas d'objet StringBuffer.
Mais cela ne gène pas dans cet exercice car comme tu le dis en faisant maString += maString + "chaine"; le compilateur crée une nouvelle instance de maString en concaténant "chaine" avec l'ancienne instance de maString.
Mais lorsque nous aurons vu les classes en ES6 je ferai un exercice dans lequel il sera demandé de créé un objet StringBuffer![]()
Justement j'ai vu un tout petit peu les classes en ES6, ça a l'air vraiment bien, ça me semble plus familier et plus lisible, en JS j'ai du mal à savoir la différence entre fonction et classe, je trouve ça étrange au premier abord surtout quand on a fait un peu de Java...
Un objet StringBuffer en ES6 ça m'a l'air intéressant...
Il n'y a pas de classes en JavaScript.
Vous essayez de reproduire un concept servant aux micro-optimisations, un Buffer, en utilisant des aspects haut niveau du langage, les classes ES6 (qui pour rappel ne sont pas des classes dans leur définition traditionnelle OOP mais du sucre syntaxique pour faire des objets prototypés avec constructeurs). Je suis prêt à parier mon chapeau que ce StringBuffer fera une contre-perf par rapport à un simple String#concat. Pour que cela soit vraiment intéressant, il faudrait utiliser les TypedArray comme le fait Node.js et son API Buffer : https://nodejs.org/api/buffer.html
Rappelons aussi qu'en JavaScript, les primitives sont immutables. Les valeurs primitives sont stockées dans une autre pile que celle des valeurs par référence. Pour les primitives, la valeur est directement stockée à l'emplacement mémoire attribué pour la variable. Tandis que pour les références, ce qui est stocké, c'est un pointeur vers l'emplacement mémoire réel de l'objet. Manipuler des primitives est donc plus rapide que ce que vous croyez, et beaucoup de micro-optimisations dans d'autres langages n'ont pas lieu d'être en JavaScript.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function changeStuff(a, b, c){ a = "changed"; b.item = "changed"; c = {item: "changed"}; } var primitive = "unchanged"; var reference1 = {item: "unchanged"}; var reference2 = {item: "unchanged"}; changeStuff(primitive , reference1 , reference2 ); console.log(primitive, reference1.item, reference2.item); // affiche unchanged changed unchanged
Merci Sylvain pour ces explications sans appel
Néanmoins, utiliser le sucre syntaxique pour faire des classes à l'identique d'autres langages historiquement objet resterait un exercice pédagogique. Une mesure comparative des célérités d’exécution pouvant ajouter vérité et piment à l'exercice.
Je suis également convaincu que tu as raison en anticipant les résultats de ces mesures.
Dommage, j'aurais bien aimé te voler ton chapeau
D'un autre côté javascript a tellement de spécificités que je ne sais pas si l'on y gagnerait quelque chose, tout au moins j'ai des doutes dans une phase d'initiation au langage. Il y a tellement de choses à voir et qui sont différentes que je ne sais pas si c'est une bonne idée de vouloir transposer systématiquement vers un autre langage que javascript. J'aurais plutôt tendance à dire aux débutant qu'il est préférable "d'oublier" les autres langages. Enfin pas tout à fait, il reste l'algorithmie et les concepts généraux, mais pour le reste c'est un langage un peu à part et pour mieux l'apprivoiser peut être vaut-il mieux ne pas trop chercher à le comparer point par point.
Enfin c'est le ressenti que j'ai eu quand je suis passé de php à javascript. A partir du moment où je n'ai plus eu le réflexe de me demander comment j'aurais fait avec mon premier langage, j'ai avancé beaucoup plus vite en javascript![]()
Salut,
Il me faut du temps pour réfléchir au message de Sylvain, j'y reviendrai plus tard...
Sinon pour ce qui est du StringBuffer ça part d'un constat quand même : pour faire l'exercice je me suis aperçu qu'on ne pouvait pas changer une string... Par exemple, je ne peux pas (à moins que je me trompe ?) changer le caractère de rang n, ou bien le supprimer, ou insérer un caractère...
On peut faire tout ça avec un tableau par exemple... Alors l'idée ce serait de pouvoir faire cela avec une string... Alors j'ai pensé qu'on pouvait à chaque fois transformer la string en tableau, faire ce qu'on a à faire sur le tableau et transformer le résultat en string... Ou bien on utilise à chaque fois juste les fonctions slice, concat... Plus rapide ?
Dans tous les cas si on avait un tel objet avec certaines des méthodes de l'objet tableau ce serait plus simple, non ?
Oui on transforme souvent les chaines de caractères en tableau avec les méthodes "split" et ensuite "join" pour concaténer le résultat après traitement.
Cela dit on peut également accéder aux éléments d'une chaine de caractère avec son index
... mais pour autant on ne peut pas appliquer directement les fonctions sur les tableaux sur une chaine de caractères (même principe que dans d'autres langages).
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 var s = 'rete ferer'; alert(s[5]); // affiche "f"
Il y a plusieurs exos sur ce sujet dans le tuto javascript mais ils viennent un peu plus tard![]()
@autran: c'est bien là le problème, il ne s'agit pas de classes à l'identique d'autres langages historiquement objet. Je le répète, il n'y a pas de classes en JavaScript. C'est pour ça que je déteste la notation class ES6 : elle induit en erreur les développeurs quant au fonctionnement réel des prototypes. J'en ai déjà beaucoup parlé sur Developpez, et il y a aussi énormément de littérature sur ce sujet : https://github.com/joshburgess/not-awesome-es6-classes
Ceci dit, je ne suis pas opposé à les présenter et à les utiliser pour un exercice. Par contre, il me paraît primordial de les présenter en dernier, après avoir fait des exercices sur les prototypes, puis sur les constructeurs, puisque c'est ce qui est utilisé en arrière-plan par les classes ES6. Si l'élève ne connaît pas ces notions, il n'a aucune chance de bien comprendre les classes ES6. Je le vois déjà à l'oeuvre avec mes collègues issus du monde Java: depuis qu'on utilise Babel, ils utilisent à tout bout de champ le mot-clé extends et font des hiérarchies de classes complètement absurdes quand un simple mixin ferait parfaitement le travail.
@ABCIWEB: même avis que toi. Je sais repérer de quel langage vient un codeur en regardant un bout de son JS. Mais aucun autre langage ne met en avant tous les atouts propres à JS.
@Beginner: oui, les String ne peuvent pas être changées, c'est ce que je veux dire par "les primitives sont immutables". Mais les String disposent de nombreuses méthodes utilitaires : https://developer.mozilla.org/fr/doc...ring/prototype
Ah ok si j'ai bien compris c'est équivalent à : alert(s.charAt(5));
Ok mais je crois qu'on ne peut pas faire : s[5] = 'a' ; ni s.charAt(5) = 'a' ; d'où la question du StringBuffer...
Oui d'où peut-être une des raisons de l'introduction de la classe StringBuffer en Java... ? En gros une string qu'on peut modifier...
Ah ok, mais en JS les strings sont des objets ou des primitives ? Ou peut-être que la question ne se pose pas en JS... Ah je viens du Java moi (niveau débutant cela dit)...
SylvainPV t'a donné un lien vers les méthodes disponibles. Et si ça ne suffit pas, comme dit plus haut on peut transformer la chaine en tableau et utiliser les méthodes des tableaux. En php c'est un peu le même principe donc je n'ai pas eu ta frustrationPeut-être y a t-il plus de similitude entre php et javascript parce que ce sont deux langage web...
Les String sont des primitives, mais les primitives sont automatiquement castées en leurs équivalents objets (constructeurs String/Number/Boolean) dès qu'on utilise une méthode dessus:
De la même façon, lorsqu'on utilise un opérateur, les équivalents objets sont automatiquement castées en leurs valeurs primitives:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 "test".toUpperCase() 530..toFixed(1); 3.14.toExponential(5) true.toString()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typeof (new Number(42)) // object typeof (new Number(42) * 1) // number (new String("hello") + new String(" world")) // "hello world" !!(new Boolean(1)) // true
@Alain
Je pense que ton conseil est sage ne pas mélanger les langage pour les débutant et suivre une progression qui s'appuie sur le langage cible
@Sylvain
Je ne voulais pas lancer un troll
Mais merci pour ces explications techniques et ton retex sur les développeurs JEEqui arrivent sur JavaScript, parce-qu’il est plus avantageux, mais qui gardent leurs mauvaises manières.
Alors du coup je renonce à cet éxo qui s’avérerait anti-pédagogique. Cependant quand j'aurai le temps je ferai une classe ES6 StringBuffer et je le testerai sur mon blog histoire de me faire de nouveaux amis
Bref c'était une fausse bonne idée....
@autran: Je ne l'ai pas pris pour un troll, et n'y vois aucune animosité de ma part ; je tenais juste à souligner ce point de vigilance, parce que je connais par expérience toutes les déviances et incompréhensions que les classes ES6 peuvent susciter. C'est vrai que l'exemple du StringBuffer me paraît mal choisi, mais on peut sans doute trouver un sujet adéquat comme exercice pratique pour les classes ES6. Mais avant ça, il faut bosser les exos sur les prototypes, car c'est à la base de tout le reste.
Bonjour à tous, j'ai une question très bête à laquelle je n'ai jamais trouvé de réponse.
Etant donné qu'on peut accéder aux bases de données avec angularJs et $http. et élaborer des mécanismes d'identification
Etant donné que le serveur Apache existe
A quoi sert Node.js ?
Dernière modification par Invité ; 31/03/2016 à 01h02.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager