2009-08-12 8 views
0

Pourquoi les comparaisons «supérieures à» ne s'appliquent-elles pas aux valeurs numériques dans JavaScript? L'exemple ci-dessous retourne vrai même lorsque le mini-nombre est inférieur au maxi.JavaScript ne comparant pas les valeurs de nombre supérieur au nombre maximal

Les valeurs mini et maxi sont des valeurs d'entrée de formulaire. Cet exemple utilise jQuery pour obtenir les valeurs, mais pourrait facilement être supprimé.

var mini = $('form#filterPrice input.min').val(); //eg. 500 
var maxi = $('form#filterPrice input.max').val(); //eg. 1500 

if(mini.valueOf() > maxi.valueOf()) { //also used: mini > maxi 
    alert('test'); //alerts "test" even when mini is less than maxi 
$('form#filterPrice input.min').val(maxi); //should switch values if mini > maxi 
$('form#filterPrice input.max').val(mini); 
} 

Remplacement "mini> maxi" avec "Math.max (mini, maxi) == mini" fonctionne très bien. Donc, ce qui suit fonctionne:

var mini = $('form#filterPrice input.min').val(); //eg. 500 
var maxi = $('form#filterPrice input.max').val(); //eg. 1500 

if(Math.max(mini, maxi) == mini) { 
    alert('test'); 
$('form#filterPrice input.min').val(maxi); 
$('form#filterPrice input.max').val(mini); 
} 
+1

Javascript peut traiter les mini et maxi comme des chaînes, et les comparer lexiquement. Dans ce cas, «500» est supérieur à «1500». Essayez de convertir mini et maxi en entiers avant de les comparer. – Karl

Répondre

4

Utilisez cette ligne pour obtenir de Int chaîne

if(parseInt(mini.valueOf(),10) < parseInt(maxi.valueOf(),10)) { //also used: mini > maxi 

sinve vous obtenez des valeurs à comparer de dom comme une chaîne. Fist vous devez les analyser en Int et ensuite seulement comparer. Il est également préférable de mettre 10 comme deuxième paramètre pour être sûr que le nombre sera analysé comme décimal.

+0

Je me demande si mini.valueOf() est nécessaire. Au lieu de cela, utilise parseInt (mini, 10) plus vite? – Andres

+0

je pense que vous avez raison –

+0

n'oubliez pas d'utiliser mini.replace (",", ""); pour supprimer des virgules ou aucune des conversions de valeur ne fonctionnera. –

0

dans le premier exemple, vous comparez des chaînes et "1500" < "500". Dans le deuxième exemple, Math.max convertit les valeurs en nombres.

+0

Vous pouvez explicitement convertir en entiers en utilisant: parseInt() – Karl