J'ai décidé de créer des fonctions isEven et isOdd simples avec un algorithme très simple:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
C'est OK si n est avec certains paramètres, mais échoue dans de nombreux scénarios. J'ai donc entrepris de créer des fonctions robustes qui fournissent des résultats corrects pour autant de scénarios que possible, de sorte que seuls les entiers dans les limites des nombres javascript soient testés, tout le reste retourne faux (y compris + et - infini). Notez que zéro est pair.
// Returns true if:
//
// n is an integer that is evenly divisible by 2
//
// Zero (+/-0) is even
// Returns false if n is not an integer, not even or NaN
// Guard against empty string
(function (global) {
function basicTests(n) {
// Deal with empty string
if (n === '')
return false;
// Convert n to Number (may set to NaN)
n = Number(n);
// Deal with NaN
if (isNaN(n))
return false;
// Deal with infinity -
if (n === Number.NEGATIVE_INFINITY || n === Number.POSITIVE_INFINITY)
return false;
// Return n as a number
return n;
}
function isEven(n) {
// Do basic tests
if (basicTests(n) === false)
return false;
// Convert to Number and proceed
n = Number(n);
// Return true/false
return n === 0 || !!(n && !(n%2));
}
global.isEven = isEven;
// Returns true if n is an integer and (n+1) is even
// Returns false if n is not an integer or (n+1) is not even
// Empty string evaluates to zero so returns false (zero is even)
function isOdd(n) {
// Do basic tests
if (basicTests(n) === false)
return false;
// Return true/false
return n === 0 || !!(n && (n%2));
}
global.isOdd = isOdd;
}(this));
Quelqu'un peut-il voir des problèmes avec ce qui précède? Existe-t-il une version meilleure (c'est-à-dire plus précise, plus rapide ou plus concise sans être obscurcie)?
Il existe divers articles relatifs à d'autres langues, mais je n'arrive pas à trouver une version définitive pour ECMAScript.
la source
Réponses:
Utiliser le module:
Vous pouvez vérifier que toute valeur en Javascript peut être forcée à un nombre avec:
Cette vérification doit de préférence être effectuée en dehors des fonctions
isEven
etisOdd
, pour ne pas avoir à dupliquer la gestion des erreurs dans les deux fonctions.la source
value
n'est pas un nombre, ou même si c'est un nombre. Ex .:0.1%2
,NaN%2
,[]%2
, etc. Qu'est - ce que vous avez écrit dans la réponse, il sait déjà.0.1
etNaN
fonctionne correctement avec la fonction ci-dessus. Un tableau vide est un peu pénible car il équivaut à 0 ...return n == parseInt(n);
pourreturn n === parseInt(n);
?n % 2 !== 0
lors de la vérification des nombres impairs, car ce n'est pas nécessairement 1, selon la langue. EDIT: Ah, c'est ce que l'.abs
appel est pour. Pas de soucis alors.Je préfère utiliser un petit test:
Cela teste si le premier bit est sur lequel signifie un nombre impair.
la source
i & 1 == 1 ? console.log("odd") : console.log("even");
Aussi, +1 pour l'efficacité au niveau du bit (pas aussi largement utilisé dans JS)Que diriez-vous de ce qui suit? Je n'ai testé cela que dans IE, mais c'était assez heureux de gérer des chaînes représentant des nombres de n'importe quelle longueur, des nombres réels qui étaient des entiers ou des flottants, et les deux fonctions renvoyaient false lorsqu'elles étaient passées un booléen, undefined, null, un tableau ou un objet. (À vous de décider si vous voulez ignorer les blancs de début ou de fin lorsqu'une chaîne est passée - j'ai supposé qu'ils ne sont pas ignorés et que les deux fonctions retournent false.)
la source
Remarque: il existe également des nombres négatifs.
où
la source
Pourquoi ne pas simplement faire ceci:
la source
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Pour terminer le test de bits de Robert Brisita.
la source
la source
if ( <expression> ) return true else return false
paradigme peut toujours être simplifié enreturn ( <expression> )
(puisque l'expression dans unif
déjà est toujours booléenne).Une simple modification / amélioration de la réponse de Steve Mayne!
Remarque: renvoie false si non valide!
la source
Nous avons juste besoin d'une ligne de code pour cela!
Voici une façon plus nouvelle et alternative de le faire, en utilisant la nouvelle syntaxe ES6 pour les fonctions JS et la syntaxe sur une ligne pour l'
if-else
appel d'instruction:la source
let isEven = num => num % 2 === 0
. :-) Mais vraiment ce n'est pas différent de beaucoup d'autres réponses ici.Quelques
la source
Autrement:
la source
Sinon, utiliser des chaînes car pourquoi pas
la source
la source
Peut être ça? if (notreNombre% 2! == 0)
la source
la source
la source
Pour tester si vous avez un nombre pair ou impair, cela fonctionne également.
la source
Utilisation du style javascript moderne:
la source
isOdd('5'))
renvoie vrai.isEven('5')
renvoie également vrai.isOdd(NaN)
jette une erreur. :-(isEven('5')
.isOdd(NaN)
devrait probablement lancer une erreur.Celui-ci est plus simple!
la source
num = -1
quand 0 / même voulu mais
la source
return parseInt(n)%2===0?true:parseInt(n)===0
. mais là encore, c'est la même chose que la plupart des autres réponses déjà ici.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Mais pourquoi parseInt ? Cela renvoie vrai pour les valeurs comme "32foo" et12.5
, qui ne sont pas paires.la source