OK merci !
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
D�veloppeur Java
Site Web
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![]()
D�veloppeur Java
Site Web
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�veloppeur Java
Site Web
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....
D�veloppeur Java
Site Web
@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.
Partager