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

typeof String et Object et Array

9 réponses
Avatar
unbewusst.sein
j'ai besoin d'implémenter une méthode pour String "belongsTo".
je l'avais fait d'une manière fonctionnelle ie. :
function belongsTo(string, array{...}
ça marchait comme je le souhaitait, me prend l'idée de passer en méthode
par prototype.
ça marche plus à cause de ma comparaison :
array[i] === aString
c'est le "===" qui va pas car quand j'ai :

var aString = "une string";
le typeof est string dans ce cas

et dans String.prototype.belongsTo=function(){...}

this est alors un objet, "normal" (d'où il suit qu'il faut changer le
=== en ==) me direz-vous, c'est quand même troublant...


par ailleurs j'ai besoin de la function "isArray" le typeof ne suffisant
pas car il retourne object.
sur quoi faire porter la différence Array, Object, #length ?
et c'est suffisant, je pense non ?
--
« L'éléphant ne peut pas courir et se gratter
les fesses en même temps. »
(Proverbe africain)

9 réponses

Avatar
unbewusst.sein
Une Bévue wrote:

par ailleurs j'ai besoin de la function "isArray" le typeof ne suffisant
pas car il retourne object.
sur quoi faire porter la différence Array, Object, #length ?
et c'est suffisant, je pense non ?



ben non car une String a une méthode length, par contre, une Array n'a
pas de méthode #charAt, donc j'ai fait :
Object.prototype.isArray=function(){
return (typeof this.length === 'undefined')? false : ((typeof
this.charAt === 'function')? false : true);
}
Object.prototype.isString=function(){
return (typeof this.length === 'undefined')? false : ((typeof
this.charAt === 'function')? true : false );
}

ça pourrait se simplifier dans le cas de #isString...

--
« L'amour, c'est quand on rencontre quelqu'un
qui vous donne de vos nouvelles. »
(André Breton)
Avatar
Pascal Poncet
Le 11/10/2011 06:36, Une Bévue a écrit :
j'ai besoin d'implémenter une méthode pour String "belongsTo".



String belongs to... what, exactly?

Pour les non anglophones du groupe :
"La chaîne appartient à... quoi, au juste ?"

--
Cordialement,
Pascal
Avatar
unbewusst.sein
Pascal Poncet wrote:


String belongs to... what, exactly?

Pour les non anglophones du groupe :
"La chaîne appartient à... quoi, au juste ?"



à une array, est contenue dans ...

par ex :

'un'.belongsTo(['zero', 'un', 'deux',...]);
va donner true.

--
« L'amour, c'est quand on rencontre quelqu'un
qui vous donne de vos nouvelles. »
(André Breton)
Avatar
Pascal Poncet
Le 11/10/2011 16:12, Une Bévue a écrit :
à une array, est contenue dans ...

par ex :

'un'.belongsTo(['zero', 'un', 'deux',...]);
va donner true.




C'est bien ce dont je me doutais.

Dans ce cas, c'est plutôt l'inverse qui se pratique, soit vérifier que
le tableau contient bien l'élément passé en argument, voire donner sa
position.

Exemple :

<script>
var nombres = ["un", "deux", "trois"];
alert(nombres.indexOf("deux")); // 1
alert(nombres.indexOf("zéro")); // -1
</script>

Reste à rajouter cette méthode, si elle n'est pas implémentée.
Voir :
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf]


--
Cordialement,
Pascal
Avatar
unbewusst.sein
Pascal Poncet wrote:


C'est bien ce dont je me doutais.

Dans ce cas, c'est plutôt l'inverse qui se pratique, soit vérifier que
le tableau contient bien l'élément passé en argument, voire donner sa
position.



je l'ai aussi, Array.prototype.include=...
je ne donnais ça qu'en exemple, le problème, amha, ne vient pas de la
fonction elle-même mais de
[Object|Array|String].prototype....
--
« L'amour, c'est quand on rencontre quelqu'un
qui vous donne de vos nouvelles. »
(André Breton)
Avatar
Pascal Poncet
Le 11/10/2011 06:56, Une Bévue a écrit :
Une Bévue wrote:
Object.prototype.isArray=function(){
return (typeof this.length === 'undefined')? false : ((typeof
this.charAt === 'function')? false : true);
}
Object.prototype.isString=function(){
return (typeof this.length === 'undefined')? false : ((typeof
this.charAt === 'function')? true : false );
}



Il sera bon de rappeler que JavaScript est un langage dynamiquement
typé, d'où la difficulté de s'appuyer sur le test d'un type de donnée.

Je pense donc que c'est la même problématique que pour les tests
relatifs aux différentes implémentations, on ne teste pas le navigateur
mais plutôt la caractéristique dont on a besoin, selon le contexte
d'exécution.

Par exemple, si j'ai une fonction qui doit recevoir un tableau en
argument, puis produire une concaténation de ses éléments, je vais
vérifier que la méthode "join()" est applicable, et non pas que la
valeur passée est bien un tableau.

<script>
function csv(list) {
if (list.join) return list.join(",");
else ...// traitement de ce cas
}
</script>

Une autre solution consiste à passer par la gestion des exceptions :

<script>
function csv(list) {
try {
return list.join(",");
} catch (error) {
...// traitement de ce cas
}
}
</script>

Mais si le test du type est vraiment nécessaire, voici une piste pour
isArray :
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray#Compatibility]


--
Cordialement,
Pascal
Avatar
Pascal Poncet
Le 11/10/2011 16:46, Une Bévue a écrit :
je l'ai aussi, Array.prototype.include=...



Tiens tiens, y a du "ruby" dans l'air, non ?

je ne donnais ça qu'en exemple, le problème, amha, ne vient pas de la
fonction elle-même mais de
[Object|Array|String].prototype....



Je ne vois pas pourquoi !
Un type String n'a pas besoin d'être testé, puisqu'on peut transtyper à
tout moment en utilisant le constructeur comme une fonction.

var tab = [1,2,3];
alert(String(tab)); // fait appel à la méthode toString de Array

--
Cordialement,
Pascal
Avatar
unbewusst.sein
Pascal Poncet wrote:

Il sera bon de rappeler que JavaScript est un langage dynamiquement
typé, d'où la difficulté de s'appuyer sur le test d'un type de donnée.



Ouais, il n'empèche qu'une fonction est généralement prévue pour un type
de donnée.

Par exemple, si j'ai une fonction qui doit recevoir un tableau en
argument, puis produire une concaténation de ses éléments, je vais
vérifier que la méthode "join()" est applicable, et non pas que la
valeur passée est bien un tableau.



c'est à peu près ce que je fais excepté que, plutôt que répéter à chaque
usage le test "if (list.join)", je souhaite créer une méthode "isArray"
par :

Object.prototype.isArray=function(){ le test qui va bien);

Et, c'est ce qui ne marche pas avec mon constructeur MVC...



--
« L'amour, c'est quand on rencontre quelqu'un
qui vous donne de vos nouvelles. »
(André Breton)
Avatar
unbewusst.sein
Pascal Poncet wrote:

Je ne vois pas pourquoi !
Un type String n'a pas besoin d'être testé, puisqu'on peut transtyper à
tout moment en utilisant le constructeur comme une fonction.



brn justement je souhaite écraser le toString() pour chaque type, en
autre choses.

var tab = [1,2,3];
alert(String(tab)); // fait appel à la méthode toString de Array



ce n'est pas le problème pour moi.

Mon problème est que, dès que je mets le moindre "prototype", comme ça :

Array.prototype.include=function(s){
for(var i=0,l=this.length;i<l;i++){if(this[i]===s){return true;}}
return false;
}

j'ai l'erreur suivante :
Uncaught TypeError: Object function (s){
for(var i=0,l=this.length;i<l;i++){if(this[i]===s){return true;}}
return false;
} has no method 'Update'

à la ligne 34 de mon code :
this.observers[i].Update( this );

bien entendu je n'ai pas cette erreur SANS le :
Array.prototype.include=function(...

this.observers étant définit par :
this.observers=new Array();

cette array est remplie par des observales qui ont bien la méthode
#Update :

function View( Observable)
{
// Attach this view to Observable
Observable.Attach( this );

// Update this view
function Update( Observable )
{
...
}
this.Update=Update;
...
}

--
« L'amour, c'est quand on rencontre quelqu'un
qui vous donne de vos nouvelles. »
(André Breton)