web-dev-qa-db-fra.com

Nombre négatif Javascript

Je veux vérifier si un nombre est négatif. Je recherche le moyen le plus simple}, donc une fonction javascript prédéfinie serait la meilleure mais je n'ai encore rien trouvé, voici ce que j'ai pour l'instant mais je ne pense pas qu'il s'agisse d'un bonne façon:

  function negative(number) { 
        if (number.match(/^-\d+$/)) {
            return true;
        } else {
            return false;
        }
   }
51
Adam

Au lieu d'écrire une fonction pour effectuer cette vérification, vous devriez juste pouvoir utiliser cette expression:

(number < 0)

Javascript évaluera cette expression en essayant d'abord de convertir le côté gauche en valeur numérique avant de vérifier si elle est inférieure à zéro, ce qui semble être ce que vous vouliez.


Spécifications et détails

Le comportement de x < y est spécifié dans §11.8.1 L'opérateur inférieur (<), qui utilise §11.8.5 L'algorithme de comparaison relationnelle abstraite.

La situation est très différente si x et y sont des chaînes, mais comme le côté droit est déjà un nombre dans (number < 0), la comparaison tentera de convertir le côté gauche en un nombre à comparer numériquement. Si le côté gauche ne peut pas être converti en nombre, le résultat est false.

Notez que cela peut donner des résultats différents par rapport à votre approche basée sur les regex, mais en fonction de ce que vous essayez de faire, cela peut finir par être correct.

  • "-0" < 0 est false, ce qui est cohérent avec le fait que -0 < 0 est aussi false.__ (voir: signé zéro ).
  • "-Infinity" < 0 est true (l'infini est reconnu)
  • "-1e0" < 0 est true (les littéraux en notation scientifique sont acceptés)
  • "-0x1" < 0 est true (les littéraux hexadécimaux sont acceptés)
  • " -1 " < 0 est true (certaines formes d'espaces sont autorisées)

Pour chacun des exemples ci-dessus, la méthode regex évaluerait le contraire (true au lieu de false et vice versa).

Références

Voir également


Annexe 1: opérateur conditionnel ?:

Il faut également dire que les déclarations de cette forme:

if (someCondition) {
   return valueForTrue;
} else {
   return valueForFalse;
}

peut être restructuré pour utiliser l'opérateur ternaire/conditionnel ?: ( §11.12 ) simplement:

return (someCondition) ? valueForTrue : valueForFalse;

L'utilisation idiomatique de ?: peut rendre le code plus concis et lisible.

Questions connexes


Annexe 2: Fonctions de conversion de type

Javascript comporte des fonctions que vous pouvez appeler pour effectuer diverses conversions de types.

Quelque chose comme ce qui suit:

if (someVariable) {
   return true;
} else {
   return false;
}

Peut être refactorisé à l'aide de l'opérateur ?: pour:

return (someVariable ? true : false);

Mais vous pouvez aussi simplifier davantage ceci pour:

return Boolean(someVariable);

Ceci appelle Boolean en tant que fonction ( §15.16.1 ) pour effectuer la conversion de type souhaitée. Vous pouvez également appeler Number en tant que fonction ( §15.17.1 ) pour effectuer une conversion en nombre.

Questions connexes

264
polygenelubricants
function negative(n) {
  return n < 0;
}

Votre expression rationnelle devrait fonctionner correctement pour les nombres de chaînes, mais cela est probablement plus rapide. (édité à partir du commentaire dans la réponse similaire ci-dessus, la conversion avec +n n'est pas nécessaire.)

11
bcherry

Que diriez-vous de quelque chose d'aussi simple que:

function negative(number){
    return number < 0;
}

La partie * 1 consiste à convertir des chaînes en nombres.

3
Wolph

C'est une vieille question, mais qui a beaucoup de points de vue, je pense qu'il est important de l'actualiser. 

ECMAScript 6 a apporté la fonction Math.sign(), qui retourne le signe d'un nombre (1 si c'est positif, -1 si c'est négatif) ou NaN si ce n'est pas un nombre. Référence

Vous pouvez l'utiliser comme:

var number = 1;

if(Math.sign(number) === 1){
    alert("I'm positive");
}else if(Math.sign(number) === -1){
    alert("I'm negative");
}else{
    alert("I'm not a number");
}

Dans ES6, vous pouvez utiliser la fonction Math.sign pour déterminer si,

1. its +ve no
2. its -ve no
3. its zero (0)
4. its NaN


console.log(Math.sign(1))        // prints 1 
console.log(Math.sign(-1))       // prints -1
console.log(Math.sign(0))        // prints 0
console.log(Math.sign("abcd"))   // prints NaN
0
JTeam