2011-12-23 3 views
4

j'ai vu dans le livre Javascript de Crockford: The Good Parts qu'il ne typeof comparaison comme ceci:Comparer les types en Javascript

return typeof a < typeof b ? -1 : 1; 

J'ai fait mes propres tests et je pense que cela est la "commande" du différents types:

function < number < object or array < string < undefined

Est-ce ainsi que JS fait la comparaison?

+1

Pourquoi auriez-vous besoin de tester si un type est « moins » un autre? Qu'est ce que ça veut dire? De plus, 'typeof()' renvoie une chaîne, donc c'est vraiment une comparaison [lexographique] (http://en.wikipedia.org/wiki/Lexicographical_order). – Chad

+0

@Chad: triant probablement les valeurs dans un tableau par type en utilisant 'Array.prototype.sort'. [Voici un exemple] (http://jsfiddle.net/6SSZP/) –

+0

@amnotiam Comme je l'ai dit, il ne va pas trier en fonction de la préséance du type, mais il va trier lexicographiquement sur la chaîne de caractères. – Chad

Répondre

4

L'opérateur typeof renvoie une chaîne. Les chaînes sont comparées par sa valeur numérique.

Ainsi, l'ordre de comparaison < serait:

type  charCode ("tfnosux".charCodeAt(i)) Example 
boolean  98         true 
function 102         Date 
number  110         123 
object  111         [] 
string  115         "" 
undefined 117         undefined 
xml  120         <x></x> 

tfnosux sont les premiers caractères des types. La méthode charCodeAt renvoie le code de caractère numérique d'un caractère en JavaScript.

J'ai ajouté un exemple de chaque type au bloc précédent. La plupart des développeurs JavaScript connaissent les premiers types. Le type final, xml, est moins connu et peut être obtenu en utilisant typeof sur EX4.

Démo de typeof: http://jsfiddle.net/9G9zt/1/

+0

Votre liste semble légèrement décalée - ne devrait-il pas être «O» avant 'S'? – bobbymcr

+0

@bobbymcr J'ai remarqué lors du calcul des valeurs de caractères numériques. Il a été corrigé;) –

+1

Quel est un exemple de quelque chose de type de données xml? – qwertymk

1

Il est pas d'importance. typeof renvoie une chaîne, et les opérateurs de comparaison travaillent pour des chaînes, en effectuant un «ordre lexicographique simple sur des séquences de valeurs de valeurs de points de code». Fondamentalement, si une chaîne commence par l'autre, alors c'est la plus grande des deux, sinon la première position de caractère qui diffère entre les deux est comparée.

Voir la section 11.8.5 du spec