Ich habe beschlossen, einfache isEven- und isOdd- Funktionen mit einem sehr einfachen Algorithmus zu erstellen :
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Das ist in Ordnung, wenn n bestimmte Parameter enthält, schlägt jedoch in vielen Szenarien fehl. Deshalb habe ich mich vorgenommen, robuste Funktionen zu erstellen, die für so viele Szenarien wie möglich korrekte Ergebnisse liefern, sodass nur Ganzzahlen innerhalb der Grenzen von Javascript-Zahlen getestet werden und alles andere false zurückgibt (einschließlich + und - unendlich). Beachten Sie, dass Null gerade ist.
// 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));
Kann jemand irgendwelche Probleme mit den oben genannten sehen? Gibt es eine bessere (dh genauere, schnellere oder präzisere Version, ohne verschleiert zu werden) Version?
Es gibt verschiedene Beiträge zu anderen Sprachen, aber ich kann anscheinend keine endgültige Version für ECMAScript finden.