alors là c'est pas gagné !!!
...autant retourner null si le tableau est vide
Code:return tableau.length ? tableau : null;
Version imprimable
au pire, transforme un peu le retour
et demandeCode:return tableau.toString()
au moins tu auras un résultat cohérent;Code:alert(retournerTableau(0)==="");
tu peux également passer par une comparaison avec un tableau vide déclaré, on comparera bien des références
avec dans la fonctionCode:var TNULL = [];// sans allusion aucune
et le testCode:return tableau.length ? tableau : TNULL;
Code:alert( retournerTableau()=== TNULL);
attention: tableau.length renverra 0 si tableau est vide...
Qu'est-ce qui t'impose ce "pas le droit" ?Citation:
En fait j'ai pas le droit de toucher à la comparaison
Parce que dans la mesure où il est impossible de comparer des tableaux, tu vas vite devoir modifier ta façon de faire... :aie:
Tu aime bien me taquiner …
Voila un bout de code qui génère des résultats différent selon les interpréteurs.
Encore plus étonnant sur Chrome et FF (a === c) => false !
Il semblerait que a et c ne référence pas le même type.
Si quelqu’un a une explication logique a cette absurdité ! Je suis preneur.
Désolé pour le hors sujet mais cela me tracasse ….
Il n'y a rien de suprenant :
a et b sont deux instances d'Array différentes donc deux objets différentsCode:
1
2
3 var a = []; var b = [];
donc
Et comme dit plus haut c'est la longueur du tableau qui doit être testée :Code:
1
2
3 a==b; //false []==[]; //false
Code:
1
2
3
4 if(retournerTableau().length==0) { //tableau vide }
a est un object généré par String.Citation:
Encore plus étonnant sur Chrome et FF (a === c) => false !
Code:alert(typeof a);
les 2 déclarations ci-dessus reçoivent bien le prototype StringCode:
1
2
3
4
5
6
7
8 String.prototype.Alert = function() { alert(this); } var a = new String('texte'); var b = 'texte'; a.Alert(); b.Alert();
Je ne te surprendrais en disant qu'une fois de plus, je ne suis pas vraiment d'accord... Je vais même finir par me demander s'il n'y a pas quelque chose de personnel :whistle:Citation:
Envoyé par dukej
Qu'il soit normal que deux valeurs identiques créées par un constructeur soient considérées comme différentes (parce que représentant de fait deux instances différentes ayant la même valeur) peut se concevoir (et encore, l'opérateur == n'est pas défini, sauf erreur de ma part pour savoir si deux valeurs représentent la même instance mais pour savoir si deux valeurs sont égales...)
En revanche, ça ne devrait pas être le cas pour une déclaration littérale, ou du moins, le comportement devrait être identique pour tous les types.
Ce qu'il y a d'étonnant, c'est donc un comportement pour les nombres et les chaines et un différent pour les autres types...
Encore faudrait'il savoir ce qu'est l'egalité literal de 2 tableaux ?
car pour moi , d'un point de vue literal, ceci ne me choquerais pas : [ 1, 2 ] == [2, 1] => true;
ben oui les 2 ensembles ont le le meme nombre d'element ainsi que leur intersection :D
Ben non, pas vraiment, un tableau JavaScript est défini par un nombre donné de couples indices / valeur.
Deux tableaux sont donc supposés être égaux si pour chaque indice, la valeur est identique et strictement égaux si pour chaque indice, sa valeur et son type sont indentiques.
ah pour moi lorsque l'on parle de "literal" c'est qu'on n'est plus dans language programation, mais dans le seul language universel exitant les maths !
si on en revient a le technique il s'agit de 2 alloctions memoire différences ( adresse, pointeur ou referance différentes ) est c'est donc normal que légalité ne fonctionne pas !
contrairement au string l’égalité de 2 tableaux n'a aucun définition ! heureusement que le langage javascript ne nous en impose pas une !
Non, lorsque je parle de littéral, c'est parce qu'il existe deux façons de déclarer des variables.
La forme constructeur :
qui instancient un objet et la forme littérale :Code:
1
2
3
4
5
6 var n = new Number(); var s = new String(); var a = new Array(); var o = new Object(); var f = new Function(); var r = new RexExp();
Code:
1
2
3
4
5
6 var n = 0; var s = ''; var a = []; var o = {}; var f = function(){}; var r = /./;
C'est pourtant défini en PHP par exemple : Opérateurs de tableaux :koi:Citation:
Envoyé par p3ga5e
Qu'est-ce qu'il y a de choquant ou d'anormal ?
^^ tu vient de me donner une autre raison de detester le langauge PHP ! merci :mouarf:
sinon concernant les déclarations littéral des objets je suis ok avec toi! mais pas pour la declaration des opérateurs sur les objets
par exemple a + b != b + a
si a et b sont des matrices de taille diferentes l'operateur + n'est pas comutatif mais quant est t'il de ta perception du + sur des Array javascript ?
c'est une question qui n'a pas de sens d'un point de vue mathématique
reste toujours le cas des strings en javascript qui reste un mystere pour moi 8O
Je pense que
correspond en interne àCode:alert( []==[] ); // Joli smiley à lunettes au passage :)
Tandis que...Code:
1
2
3
4
5
6
7
8
9 var x, y; // Tableau #1 x=[]; // x référence le tableau #1 nouvellement créé // Tableau #2 y=[]; // y référence le tableau #2 nouvellement créé alert( x==y ); // False (ce n'est pas le même tableau qui est référencé)
Il nous manque vraiment une documentation sur la gestion des variables en mémoire par les interpreteurs Javascript. Nous ne devrions plus nous poser ce genre de questions aujourd'hui.Code:
1
2
3
4
5 var x, y; x=y=[1,2]; // x et y référencent le même tableau nouvellement créé alert( x==y ); // True