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 ?
- 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
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
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:4baaa5d2@meta.neottia.net>
<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.
- 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
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.
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.
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é.
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é.
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é.
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 ?
------------------------------------------------------------------------ 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
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 ?
------------------------------------------------------------------------
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.
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 ?
------------------------------------------------------------------------ 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.