Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Array, length, un element nombre.

6 réponses
Avatar
Mihamina Rakotomandimby (R12y)
Bonjour,

A cause d'un problème de Array, j'ai du chercher, et trouver:
http://www.devguru.com/technologies/ecmascript/QuickRef/array.html

[...]
fruit = new Array(7)
If you create an array with a single numeric parameter, that number is
stored in the length property, and the array doesn't actually have any
elements until some are specifically assigned to it. If, however, the
parameter is not a number, an array of 1 element is created and that value
assigned to it. You can easily increase the size of an array by assigning a
value to an element higher than its current length.
[...]

Bon. Moi, je travaille avec des arrays, il n'y aura que des nombres dedans.
Et le cas ou il n'y a qu'un seul élément est un cas particulier qui
necessite un traitement particulier. J'ai donc besoin de vraiment
avoir "fruit.length == 1" dans le cas cité en exemple.
Solution que j'ai trouvé (à la va vite), transformer les nombres en chaines
de caractères {fruit= new Array("7");}, et si j'ai besoin de leur valeur
numérique, je re-transforme en nombre...

Autrement, comment fait-on?
Merci.

Accessoirement... quel est la logique de cette "fonctionalité"? C'est
piégeux, vicieux, même pas subtil,... ou bien?

6 réponses

Avatar
Olivier Miakinen

A cause d'un problème de Array, j'ai du chercher, et trouver:
http://www.devguru.com/technologies/ecmascript/QuickRef/array.html

[...]
fruit = new Array(7)
If you create an array with a single numeric parameter, that number is
stored in the length property, and the array doesn't actually have any
elements until some are specifically assigned to it. If, however, the
parameter is not a number, an array of 1 element is created and that value
assigned to it. You can easily increase the size of an array by assigning a
value to an element higher than its current length.
[...]


La norme ECMAScript précise que si le paramètre len est un nombre mais
que ToUint32(len) n'est pas égal à len (donc en particulier si c'est un
nombre négatif ou non entier), une exception RangeError est levée.

Si len n'est pas un nombre, le comportement du constructeur à un
paramètre est le même que lorsque le nombre de paramètres est 0 ou
bien supérieur ou égal à 2.

Bon. Moi, je travaille avec des arrays, il n'y aura que des nombres dedans.
Et le cas ou il n'y a qu'un seul élément est un cas particulier qui
necessite un traitement particulier. J'ai donc besoin de vraiment
avoir "fruit.length == 1" dans le cas cité en exemple.
Solution que j'ai trouvé (à la va vite), transformer les nombres en chaines
de caractères {fruit= new Array("7");}, et si j'ai besoin de leur valeur
numérique, je re-transforme en nombre...

Autrement, comment fait-on?


Par exemple :
fruit = new Array(); fruit.push(7);

Il y a plein d'autres méthodes. Il semblerait, si je comprends la doc,
que ceci en soit une aussi, plus simple :
fruit = [ 7 ];

Accessoirement... quel est la logique de cette "fonctionalité"? C'est
piégeux, vicieux, même pas subtil,... ou bien?


C'est piégeux, et probablement dû au poids de la compatibilité avec la
définition initiale de JavaScript. Si seulement c'était le seul piège de
JavaScript !

Avatar
ASM

Autrement, comment fait-on?


Tableau d'un seul élément qui est un nombre :
var fruit = new Array();
fruit[0] = 7;
ou :
var fruit = [7];

Tableau de plusieurs éléments dont des nombres :
var fruits = new Array(7,'orange',12,'melon',253,'pomme');
ou :
var fruits = [7,'orange',12,'melon',253,'pomme'];

Accessoirement... quel est la logique de cette "fonctionalité"? C'est
piégeux, vicieux, même pas subtil,... ou bien?


Logique ? je sais pas ...
Vicieux ? non ça ne m'a jamais posé de pb métaphysique
... si ce n'est : pourquoi fixer d'avance la taille d'un tableau ?


à rapprocher de :
var vue = new Image();
var vue = new Image(125,45);
où la aussi on a qques particularités

il suffit de connaître ces particularismes :-)

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
Olivier Miakinen

var fruit = [7];


Je te remercie de confirmer ma lecture de la norme. C'est tellement
difficile à lire que je n'étais vraiment pas sûr de moi sur ce coup.

à rapprocher de :
var vue = new Image();
var vue = new Image(125,45);


Je ne connaissais pas. C'est du DOM ?

où la aussi on a qques particularités

il suffit de connaître ces particularismes :-)


Tu nous en dis plus ?

Avatar
Pascal PONCET
à rapprocher de :
var vue = new Image();
var vue = new Image(125,45);


Je ne connaissais pas. C'est du DOM ?


Oui, c'est du DOM niveau 0.
Les arguments "largeur, hauteur" sont facultatifs, d'où les 2 écritures
possibles.
C'est ce qui permet de précharger des images, par exemple, à condition
de spécifier une valeur pour la propriété "src" des objets "Image".


Avatar
ASM
var fruit = [7];


Je te remercie de confirmer ma lecture de la norme.


:-)

C'est tellement difficile à lire


Tu veux dire quasi impossible, je présume ?
Enfin ... perso, j'ai renoncé.

que je n'étais vraiment pas sûr de moi sur ce coup.


Je ne suis jamais sûr de rien ... y a pas mieux que les tests.

à rapprocher de :
var vue = new Image();
var vue = new Image(125,45);


Je ne connaissais pas. C'est du DOM ?


Du JS de nos grands mères :-)

document.images = arbre des images
(comme on a ceux des forms, anchors, links ... )

déclarer une nouvelle image :
var truc = new Image();

déclarer une nouvelle image en pré-précisant sa taille
var truc = new Image(width, height);
width et height représentant largeur et hauteur (en pixels) sans unité

lui attribuer un chemin (sinon ça n'a pas beaucoup d'intérêt)
truc.src = 'chemin/de/mon/image.jpg';

Permet de pré ou post loader (pré ou post charger et post c'est mieux)
des images pour pouvoir les utiliser "dynamiquement" plus tard.

Mais :
truc = new Image();
truc.src = 'img1.png';
ne suffit pas réellement à charger l'image :
si l'utilisateur clicote pendant le chargement, ce dernier s'interrompt
(et ne reprend pas)
Utilisé simplement sous cette forme n'est réellement intéressant que si
on retrouve de page en page ce post-chargement car alors, par
l'indication du chemin, le navigateur prendra l'image déjà en cache.

Toujours en JS de nos grands mères :
afficher cette nouvelle image à la place d'une autre déjà affichée

document.cetteImage.src = truc.src;
ou :
document.images['cetteImage'].src = truc.src;
avec :
<img name="cetteImage" src="autre_image.jpg" alt="">


Pour mémoire,
forcer le post-chargement d'une série d'images en cache
(compatible tous brouteurs depuis NC4 au moins) :

JS :
=== // tableau des chemins
// en profitant de nos nouvelles connaissances :-)
var I = ['img1.png','bidule.jpg','chose.jpg'];
// tableau vide (pour déclarer et utiliser les images)
var V = [];
// fixer le nbre d'images à charger
var i = I.length;
// fonction de chargement
function imgsLoad() {
i--;
if(i>=0) {
V[i] = new Image();
V[i].onload = imgsLoad;
V[i].src = I[i];
}
}
// post chargement
onload = imgsLoad();

HTML (exemple) :
=============== <form>
Changer d'image :
<select onchange="var k=this.selectedIndex;
document.cetteImage.src = V[k].src;">
<option> image 1
<option> image 2
<option> image 3
</select>
<img name="cetteImage" src="autre_image.jpg" alt="">
</form>



il suffit de connaître ces particularismes :-)


Tu nous en dis plus ?


var opt = new Option(text, value);
par exemple ?

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
ASM

// post chargement
onload = imgsLoad();


onload = imgsLoad;


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé