OVH Cloud OVH Cloud

Vider un tableau

21 réponses
Avatar
Caius Pupus
Bonjour,

Quelle est la meilleure solution pour vider simplement un tableau ?
Pour un tableau nommé "mon_tab", je pourrais faire une des solutions
suivantes :
- mon_tab = new Array(); // Je le recrée donc je le vide
- mon_tab.length = 0; // Autre solution que j'ai vue sur le web

Laquelle de ces solutions est la plus recommandée (moins gourmande en
mémoire, rapidité, etc.) ? Y a-t-il d'autres solutions encore plus fiables ?

Merci à vous ;-)

CP

10 réponses

1 2 3
Avatar
SAM
Le 5/7/10 11:16 AM, Mickaël Wolff a écrit :
Le 06/05/2010 19:41, Pascal a écrit :
Bonjour,

Mickaël Wolff a écrit :
- mon_tab.length = 0; // Autre solution que j'ai vue sur le web


En plus d'être sémantiquement cavalier, j'ai des doutes quand à la
réalité de l'opération.



Pourquoi ça ?
La propriété "length" est bien définie en lecture comme en écriture.



Bon d'accord, le standard le définit.
<http://bclary.com/2004/11/07/#a-15.4.5.1> Mais je ne trouve pas ça
intuitif.



c'est pourtant ce qu'on emploie (employait?)
couramment pour une collection
ne serait-ce que bêtement pour :

var s = document.forms[0].monSelect;
s.options.length = 0;
for(var i=0; i<opts.length; i++)
s.options[i] = new Option(opts[i][0];opts[i][1]);


monTable.rows.length = 0;
... pas très certain que ça vide le table (supprime les rangées)
c'est même sûr que non (getter only)

ce n'est donc peut-être pas si "intuitif"
ou ne pas mettre à toutes les sauces.

--
sm
Avatar
Olivier Miakinen
Bonjour,

Le 06/05/2010 19:33, Mickaël Wolff a écrit :

- mon_tab.length = 0; // Autre solution que j'ai vue sur le web



En plus d'être sémantiquement cavalier, j'ai des doutes quand à la
réalité de l'opération. Et j'aurais tendance à dire qu'il y a un risque
de fuite mémoire. Il faudrait que nous ayons la garantie que les
éléments référencés soient réellement libérés.



C'est garanti par la norme, ainsi que je le mentionnais il y a quelques
semaines :
<news:
<http://groups.google.fr/group/fr.comp.lang.javascript/msg/bc689227afdcbfad?output=gplain>

Voir en particulier l'étape 14 que l'on exécute lorsque l'on met à jour
la propriété length d'un tableau, Result(12) étant la valeur assignée à
length (0 dans le cas présent) :
======================================================================= > 14. For every integer k that is less than the value of the length property of A but not less than
Result(12), if A itself has a property (not an inherited property) named ToString(k), then delete
that property.


=======================================================================
Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.

Cordialement,
--
Olivier Miakinen
Avatar
Mickaël Wolff
Le 07/05/2010 18:21, Olivier Miakinen a écrit :
Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.



Gotcha ? ;)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 11/05/2010 15:05, Mickaël Wolff m'a répondu :

Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.



Gotcha ? ;)



Dieses Forum ist französisch sprechend.

(en clair : j'ai rien compris)
Avatar
SAM
Le 5/11/10 3:05 PM, Mickaël Wolff a écrit :
Le 07/05/2010 18:21, Olivier Miakinen a écrit :
Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.



Gotcha ? ;)



et en fr ? Capté ? ... ?

--
sm
Avatar
SAM
Le 5/11/10 3:59 PM, Olivier Miakinen a écrit :
Le 11/05/2010 15:05, Mickaël Wolff m'a répondu :
Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.


Gotcha ? ;)



Dieses Forum ist französisch sprechend.



c'est bientôt fini de postillonner partout ?

(en clair : j'ai rien compris)



Gotcha = Oh? OK! I've got you !

<http://en.wikipedia.org/wiki/Gotcha>

sinon c'est du verbiage en C

--
sm
Avatar
SAM
Le 5/11/10 3:59 PM, Olivier Miakinen a écrit :
Le 11/05/2010 15:05, Mickaël Wolff m'a répondu :
Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.


Gotcha ? ;)



Dieses Forum ist französisch sprechend.

(en clair : j'ai rien compris)



en deutche : Erwischt

si tu préfères

--
sm
Avatar
Olivier Miakinen
Le 11/05/2010 16:20, SAM a écrit :

Bien sûr, si des indices non numériques ont été utilisés, ceux-ci ne
sont pas effacés.


Gotcha ? ;)



Dieses Forum ist französisch sprechend.
(en clair : j'ai rien compris)



en deutche : Erwischt



Arzo, ya !

si tu préfères



En fait, non. ;-)

Même traduit en français par « T'ai-je eu ? ;-) », je ne comprends pas
ce que Mickaël voulait dire.
Avatar
Mickaël Wolff
Le 11/05/2010 14:05, Mickaël Wolff a écrit :

Gotcha ? ;)



C'est du jargon de programmeur qui se traduit grossièrement par «
idiosyncrasie », ce qui est moins court, moins juste, et encore plus
insultant : <http://www.debian.org/intl/french/lexique#g>

En gros, ici, on croit avoir vidé le tableau en ayant utilisé
a.length, mais en réalité, on s'est fait avoir par une subtilité.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 11/05/2010 23:06, Mickaël Wolff a écrit :

Gotcha ? ;)



C'est du jargon de programmeur qui se traduit grossièrement par «
idiosyncrasie », ce qui est moins court, moins juste, et encore plus
insultant : <http://www.debian.org/intl/french/lexique#g>

En gros, ici, on croit avoir vidé le tableau en ayant utilisé
a.length, mais en réalité, on s'est fait avoir par une subtilité.



Merci.

Maintenant que j'ai compris ce que tu voulais dire, je peux te répondre.

Il y a deux cas : les utilisateurs normaux qui utilisent les tableaux
JavaScript comme des tableaux en JavaScript, et les chercheurs de petite
bête qui, sachant qu'un Array hérite de Object, vont détourner cet objet
de l'usage prévu et y mettre n'importe quoi.

Les premiers ne se font pas avoir par une subtilité parce qu'ils n'ont
même pas l'idée de prendre comme index un nombre flottant, ni un entier
supérieur à 2^32, et encore moins une chaîne de caractères quelconque.

Les seconds ne se font pas avoir par une subtilité parce que, ayant
utilisé un tableau selon un usage à priori non prévu pour les tableaux,
ils ne s'attendent pas à ce qu'il se comporte comme un tableau tout simple.

Ah, il y a un troisième cas :
------------------------------------------------------------------------
Le 06/05/2010 19:33, Mickaël Wolff a écrit :

- mon_tab.length = 0; // Autre solution que j'ai vue sur le web



En plus d'être sémantiquement cavalier, j'ai des doutes quand à la
réalité de l'opération. Et j'aurais tendance à dire qu'il y a un risque
de fuite mémoire. Il faudrait que nous ayons la garantie que les
éléments référencés soient réellement libérés.

[...] Y a-t-il d'autres solutions encore plus fiables ?



Hop :

Array.prototype.clear = function() { this.splice(0, this.length) }
a.clear() ;


------------------------------------------------------------------------
Ce troisième cas, c'est celui des gens qui croient qu'utiliser splice()
sera plus efficace que mettre length à 0, alors que c'est *exactement*
la même chose (en plus compliqué) : cela effacera les index numériques
entre 0 et 2^32-1, et laissera les autres.

:-D

--
Olivier Miakinen
1 2 3