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 :

Bizarrerie avec javascript


Sujet :

JavaScript

  1. #1
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut Bizarrerie avec javascript
    javascript ne sait pas comparer des variables aryay ou des objets ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var foo=[0,2]
    var bar=[0,2]
    alert(foo==bar)
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var foo={}
    var bar={}
    alert(foo==bar)
    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 !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Points : 210
    Points
    210
    Par défaut
    Non comme en java (et d'autres surement) tes variables foo et bar ont pour la valeur des références vers deux objets/tableaux différents.

    Pour faire ce que tu veux faire tu dois implémenter une méthode equals qui comparerait non les références, mais les valeurs contenues dans la structure de donnée.

    Cette méthode equals pouvant être récursive si ton objet/tableau contient d'autres objets/tableaux, et aussi gérer le cas où tu te trouverais dans une référence cyclique.

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    ben non, comparaison par référence...

    [damned: I am grilled;]

  4. #4
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    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

  5. #5
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i in foo){
    	if(bar[i]!=foo[i])alert("pas pareil")
    }

  6. #6
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par javatwister
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i in foo){
    	if(bar[i]!=foo[i])alert("pas pareil")
    }
    Pas vraiment

    [0, 1] serait sinon égal à [2, 1, 0]
    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

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    mais non
    (ce me semble; même si j'ai pas affiné)

    sachant qu'on traite des tableaux avec la même organisation; à la moindre différence, tu peux demander un break;

  8. #8
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Pas vraiment

    [0, 1] serait sinon égal à [2, 1, 0]
    ??

    foo[0] != bar[0]
    ([0,1])[0] != ([2,1,0])[0]
    (0 != 2) -> BREAK

    dans ce cas, ça fonctionne


    par contre bien vu, dans le cas d'un objet (non array) si l'un des deux contient plus d'éléments que l'autre, la méthode de javatwister ne fonctionnera pas si le plus petit est comparé au plus grand.


    pour les array, ça fonctionnera dans tous les cas, car l'un des "i" sera "length".
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  9. #9
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    ben après on peut tester sur les arrays triés ou pas selon que l'on veuille une egalité des indexes et des contenus ou juste du contenu ...
    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 !

  10. #10
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Willpower: j'avoue

    SpaceFrog: j'avoue


  11. #11
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Willpower
    ??

    foo[0] != bar[0]
    ([0,1])[0] != ([2,1,0])[0]
    (0 != 2) -> BREAK

    dans ce cas, ça fonctionne
    Arf, oui, j'ai été un peu enthousiaste...
    Mais on aura bien

    Ou alors, il faut exécuter deux fois le code : foo ?== bar puis bar ?== foo.
    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

  12. #12
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    en testant length à la base, pas problème, je pense;

  13. #13
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Arf, oui, j'ai été un peu enthousiaste...
    Mais on aura bien

    Ou alors, il faut exécuter deux fois le code : foo ?== bar puis bar ?== foo.
    relis mon message. ;-)

    dans le cas d'array, un "for(i in obj)" assignera succesivement au "i" tous les indices du tableau ainsi que la valeur "length"(il me semble) donc la longueur des array sera comparé et ça empechera ce genre d'erreur.


    EDIT: oups, je retire ce que j'ai dis au sujet du length, apparement je me suis fourvoyé. il faut bien tester length en plus.

    par contre pour les objets (non array), il faudra utiliser une solution comme proposée ici :
    http://stackoverflow.com/questions/1...-in-javascript


    bien que je ne comprends pas pourquoi il compare les "function" sous forme de string au lieu de le gérer comme le reste avec une comparaison normale. (sauf s'il veut inclure dans sa comparaison des fonctions similaires mais non-égales en terme de signature/prototype).

    et je ne comprend surtout pas pq il crée 3 boucles au lieu de 2 (la première pouvant être include dans la seconde.)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    pour les arrays on dirait que l'on peut utiliser .toString()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var foo=[0,1]
    var bar=[0,1]
    alert(foo.toString()==bar.toString())
    pour les json non
    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
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    oui Spaf, puisque là, tu retrouves une comparaison par valeur (String...)

  16. #16
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    voici le code corrigé du lien que j'ai donnée plus haut. (avec optimisation pour les arrays, sans plantage pour les objets dom, etc..)

    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
    31
    Object.prototype.equals = function(x){
    	var p;
    	if( typeof(x) != 'object' )
    		return false;
    	if( (x.length || this.length) && (x.length !== this.length) )
    		return false;
    	for(p in this) {
    		if( typeof(x[p]) == 'undefined' )
    			return false;
    		switch( typeof(this[p]) ){
    			case 'function':
    				if( typeof(x[p]) == 'undefined' || this[p].toString() != x[p].toString() ) 
    					return false;
    				break;
    			case 'object': // array or object(no dom) with recurse
    				if( !this[p].nodeType ){
    					if( !this[p].equals(x[p]) )
    						return false;
    					break;
    				}
    			default:
    				if (this[p] != x[p]) 
    					return false;
    		}
    	}
    	if( typeof(x.length) == 'undefined' )
    		for(p in x)
    			if( typeof (this[p]) == 'undefined' )
    				return false;
    	return true;
    };
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    pour les arrays on dirait que l'on peut utiliser .toString()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var foo=[0,1]
    var bar=[0,1]
    alert(foo.toString()==bar.toString())
    pour les json non
    Je suis très surpris que tu ouvres un topic pour une chose aussi simple que la comparaison d'objets en JS qui ne se fait que sur des références. Alors que tu fais pleins de choses en JS à coté.

    Attention au toString(); ça ne fait que te retourner le tableau en string et du coup tu te retrouves avec une comparaison de types primitifs
    Et attention justement à ne pas tester un tableau d'objet de cette manière, car sinon tu peux te retrouver avec des résultats de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [{},{}].toString()==[{titi:"tata"},{tuto:1}].toString();
    => true
    Car de chaque coté on a : "[object Object],[object Object]" comme valeur.

    Et si je me rappelle bien je crois que tu as déjà écris une méthode de copie récursive, tu pourrais donc t'en servir pour tester l'égalité de 2 objets

  18. #18
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    C'est juste pour relancer un troll...

    Au départ je suis tombé sur un teste d'égalité alert([]==[]) en bidouillant une sorte de empty() pour javascript.

    Ensuite ma curiosité m'a poussé à vouloir comparer des arrays et des jsons, sans trier ni boucler, ni importer une lib.

    Forcément le toString() masque les types, mais bon js et typage ...

    Bon encore une fois je tentais de réinventer le fil à couper l'eau tiède ...
    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 !

  19. #19
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par SpaceFrog
    Bon encore une fois je tentais de réinventer le fil à couper l'eau tiède ...
    T'as raison ma poule! faut pas se laisser aller

Discussions similaires

  1. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55
  2. Defilement de la fenetre avec JavaScript
    Par black is beautiful dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2004, 10h21
  3. Lien ASP avec javascript
    Par RATIER dans le forum ASP
    Réponses: 3
    Dernier message: 15/07/2004, 08h54
  4. Réponses: 4
    Dernier message: 27/04/2004, 14h45

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