typeof marche bien avec les booléens, nombres, chaînes et fonctions. Mais pas avec Array ni RegExp, même lorsqu'on les déclare de manière littérale :
1 2 3 4
| >>> typeof []
"object"
>>> typeof /^$/
"object" |
Pour moi c'est un peu le type natif qui est une aberration en JS : tout n'est pas censé être objet ?
En revanche, on dispose de l'opérateur instanceof, bien pratique si on sait à l'avance quel type on est susceptible de rencontrer :
1 2
| >>> [] instanceof Array
true |
Là où c'est délicat, c'est si on s'amuse à déclarer des types natifs avec l'opérateur new :
1 2 3 4 5
| >>> var x = new Number(2)
>>> x instanceof Number
true
>>> typeof x
"object" // pfff
|
Encore mieux :
1 2
| >>> 12 instanceof Number
false |
jQuery utilise beaucoup de méthodes à paramètres optionnels ou quel l'on peut passer dans n'importe quel ordre ; il n'est pas rare d'y trouver des séquences de détection de type comme celle-ci :
if (typeof arg1 == "string" || arg1 instanceof String)
Tout ça pour dire quoi ?
JavaScript n'est pas un langage orienté objet. C'est un langage orienté aspect. Un objet n'a pas besoin d'être de tel ou tel type du moment qu'il offre bien les propriétés et méthodes qu'on veut utiliser. C'est le principe du duck typing.
Alors oui, je suis tout à fait d'accord, la détection de type est un gros bordel en JS. Mais à part pour l'exemple de jQuery ci-dessus, je n'ai jamais vu de cas où c'était vraiment nécessaire.
1 2 3
| if (method in obj) {
return obj[method]();
} |
Ça, c'est vraiment puissant, non ?
Partager