Ho deciso di creare la semplice funzione isEven e isOdd con un algoritmo molto semplice:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Questo è OK se n è con alcuni parametri, ma fallisce per molti scenari. Quindi ho deciso di creare funzioni robuste che offrano risultati corretti per tutti gli scenari che ho potuto, in modo che vengano testati solo numeri interi entro i limiti dei numeri javascript, tutto il resto restituisce false (inclusi + e - infinito). Si noti che zero è pari.
// 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));
Qualcuno può vedere problemi con quanto sopra? Esiste una versione migliore (ovvero più accurata, più veloce o più concisa senza essere offuscata)?
Esistono vari post relativi ad altre lingue, ma non riesco a trovare una versione definitiva per ECMAScript.