IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tableaux et affectation


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut Tableaux et affectation
    Bonjour...

    je viens de tomber sur un truc tout con mais qui me casse la tete..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    var aSelectTotal 	= new Array(1,2,3,4);
    var aSelect 	= new Array(1,2,3);
     
    alert(aSelect.length+" / "+aSelectTotal.length);
    aSelect = aSelectTotal;
    alert(aSelect.length+" / "+aSelectTotal.length);
    aSelect.push(5,6);
    alert(aSelect.length+" / "+aSelectTotal.length);
    ben normalement les alertes devraient etre : 3 /4 puis 4 / 4 puis 6 / 4

    ben non c 3 / 4 puis 4 / 4 et 6 / 6

    Je ne cromprends vraiment pas !!!!

    Merci de votre aide !!

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    As tu essayé d'afficher tes tableaux à chaque modification? Pour voir simplement s'il n'y a pas un problème au niveau des tableaux.

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Salut,
    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aSelect = aSelectTotal;
    aSelect pointe vers aSelectTotal, donc toute modification sur l'un est répercutée sur l'autre.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Ah bah non c'est normal tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aSelect = aSelectTotal;
    Faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aSelect == aSelectTotal;

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    l'egalité d'array est une affectation par reference ...
    aSelect et aSelectTotal pointent vers un seul et même array

    il faut partir d'un nouvel array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var aSelectTotal 	= new Array(1,2,3,4);
    var aSelect 	= new Array(1,2,3);
     
    alert(aSelect.length+" / "+aSelectTotal.length);
    aSelect = new Array();
    aSelect=new Array().concat(aSelectTotal);
    alert(aSelect.length+" / "+aSelectTotal.length);
    aSelect.push(5,6);
    alert(aSelect.length+" / "+aSelectTotal.length);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre Expert
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Par défaut
    Citation Envoyé par babib92 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    aSelect = aSelectTotal;
    A ce niveau, tu ne clone pas l'objet, tu fais pointer aSelect sur le même emplacement que aSelectTotal...
    Il faut que tu implémentes une fonction clone:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array.prototype.clone = function() {
      var res = [];
      for(var i=0,size=this.length;i<size;i++) {
        res.push(this[i]);
      }
    }
     
    // ...
    aSelect = aSelectTotal.clone();

  7. #7
    Membre Expert
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Par défaut
    La solution de SpaceFrog est très vite 2 fois plus performante et même de mieux en mieux avec la volumétrie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Array.prototype.clone = function() {
    			new Array().concat(this);
    		}

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    ok merci pour ces réponses...

    C'est quand meme déroutant cette affaire...

    j'étais jamais tombé sur ce cas... fallait savoir que cela ne copiait pas le tableau mais pontait vers la meme reference.

    avec un autre type de variable (ex a = 1; b = 2; a = b; a++ cela ne modifie que a et pas b.

    Je retiens donc la leçon et vous remercie

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    cela ne marche pas :

    Code : 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
     
    var aSelectTotal 	= [1,2,3,4];
    var aSelect 		= [1,2,3];
     
    Array.prototype.clone = function() {
    	new Array().concat(this);
    }
     
     
    function afficheTable(iTest) {
    	sAlert = "Test "+iTest+") :\n---------------------\n";
    	sAlert += "Tableau aSelect ("+aSelect.length+") :\n---------------------\n";
    	for( i = 0; i < aSelect.length ; i++) {
    		sAlert += i+ " : " + aSelect[i] + "\n";
    	}
    	sAlert += "Tableau aSelectTotal ("+aSelectTotal.length+") :\n---------------------\n";
    	for( i = 0; i < aSelectTotal.length ; i++) {
    		sAlert += i+ " : " + aSelectTotal[i] + "\n";
    	}
     
    	alert(sAlert);
    }
     
     
     
    afficheTable(1);
    aSelect = aSelectTotal.clone();
    afficheTable(2);
    aSelect.push(5,6);
    afficheTable(3);
    erreur : afficheTable(2) => aSelect is undifined

  10. #10
    Membre Expert
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Par défaut
    Il manque le return desole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Array.prototype.clone = function() {
    	return new Array().concat(this);
    }

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    Autant pour moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Array.prototype.clone = function() {
    	var a = new Array().concat(this);
    	return a;
    }
    Pour les utilisateur de jquery g trouvé ça aussi (je sais pas si aussi bien car je ne connais pas le procésus de $.extend)... c'est peut etre (sans doute) plus lourd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aSelect  = $.extend(true, [], aSelectTotal);

  12. #12
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Il me semble avoir lu quelque part que le plus performant serait en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var test = [1, 2, 3];
    var test2 = test.join('|').split('|');
    test2.push(4, 5);
    alert(test+"\n"+test2)
    A tester...

    EDIT :
    Bon, ben après avoir testé, je retourne dans mes 22
    C'est la solution de gwyohm la plus rapide, puis celle de Spaffy et la mienne est aux choux... (du moins, avec FF 3.5 et un test sur 1000 à 1000000 éléments).
    Voir l'exemple de la FAQ.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    Connaissez vous un outil qui permette de tester la performance d'une methode par rapport à une autre ?

  14. #14
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    suffit de se faire son propre benchmark ..
    y'en n'a pas dans les contributions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avec un autre type de variable (ex a = 1; b = 2; a = b; a++ cela ne modifie que a et pas b.
    oui mais cette syntaxe ne te choque pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var obj=document.getElementById('moninput');
    obj.value='huitre transilvanienne';
    Javascript semble avoir le comportement d'affectation par référence et non par valeur pour les objets ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  15. #15
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    +1 Spaffy, je rajouterais quand-même une précision
    avec un autre type de variable (ex a = 1; b = 2; a = b; a++ cela ne modifie que a et pas b.
    En réalité, l'objet Array est un type particulier d'objet Object (pour s'en persuader, faire un alert du typeof d'une variable tableau puis puis un du constructor).
    Or, quand tu utilises un type Object, tu crées une instance de cet objet.
    Donc, quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var tableau2 = tableau1;
    c'est bien l'instance de cet objet que tu copies, donc effectivement, la référence à l'objet instancié.
    A l'inverse, les "objets" String ou Number sont des propriétés de Object (un typeof d'une variable de type chaîne te renvoie "string", pas "String") donc quand tu fais une copie, tu copies la propriété, pas l'instance, les deux variables sont donc déliées (ce qui d'ailleurs ne vaut pas pour le cas particulier this qui continue à hériter de l'original après une copie, c'est donc un Object à part entière).
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    @ Bovino : Merci beaucoup pour ces précisions

    @ SpaceFrog :

    oui mais cette syntaxe ne te choque pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var obj=document.getElementById('moninput');
    obj.value='huitre transilvanienne';
    Là je dois avouer que je ne vois pas le rapport. Tu changes un attribut de l'objet... et il n'y a pas de référence. Pour m'expiquer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var sTxt = "huitre transilvanienne";
    var obj=document.getElementById('moninput');
    obj.value=sTxt;
     
    sTxt = "moule normande";
    Le valeur de l'input n'est pas modifiée

  17. #17
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    le rapport est simple :
    on affecte à obj un objet
    tout comme tu le faisais en affectant à ta variable un array

    Donc dans un cas ça t'étonne que l'objet initial change de valeur et pas dans le second ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  18. #18
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var obj=document.getElementById('moninput');
    ta variable ogj ne contient pas réellement l'objet auquel elle fait référence.
    Pour preuve, si tu fais ensuite
    ta variable ne contient plus rien pourtant ton input existe toujours.
    Mais si tu modifies une propriété de obj (dans l'exemple, c'est value), la variable et l'objet référencé sont impactés et ton input a été modifié.
    Il s'agit donc bien d'un cas similaire (pas identique effectivement) à ta question sur les tableaux, donc ce que voulais dire Spaffy, c'est que cette particularité que tu soulevais, en fait tu l'utilises tout le temps
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    Ah ok j'ai compris...

    Alors merci pour ces précisions... ça auras été une journée constructive...
    bien @ vous ;o)

  20. #20
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ben c'est toujours plus sympa de répondre à ce genre de question qu'à
    Pourquoi je n'arrive pas à faire un getElementById si j'ai pas mis d'id dans ma page

    En plus, grâce à toi, on a enrichi la FAQ !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème affectation de Tableaux
    Par Luigiii dans le forum Langage
    Réponses: 14
    Dernier message: 15/03/2013, 14h02
  2. [WD-2010] Affecter la même police à tous les tableaux
    Par NorocBzh dans le forum Word
    Réponses: 4
    Dernier message: 19/02/2013, 09h03
  3. Confusion affectation tableaux et structures en langage C
    Par DarkPoster14 dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2013, 21h48
  4. [c#2] affectation entre deux tableaux en c#
    Par mstic dans le forum C#
    Réponses: 4
    Dernier message: 16/07/2007, 10h44
  5. [Tableaux] Affectation de variable :)
    Par marie4449 dans le forum Langage
    Réponses: 37
    Dernier message: 23/05/2006, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo