Saya memutuskan untuk membuat sederhana ISEVEN dan ISODD fungsi dengan algoritma yang sangat sederhana:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Tidak apa-apa jika n dengan parameter tertentu, tetapi gagal untuk banyak skenario. Jadi saya mulai membuat fungsi yang kuat yang memberikan hasil yang benar untuk sebanyak mungkin skenario, sehingga hanya bilangan bulat dalam batas angka javascript yang diuji, yang lainnya mengembalikan false (termasuk + dan - tak terhingga). Perhatikan bahwa nol adalah genap.
// 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));
Adakah yang bisa melihat masalah dengan hal di atas? Apakah ada versi yang lebih baik (yaitu lebih akurat, lebih cepat atau lebih ringkas tanpa dikaburkan)?
Ada berbagai posting yang berkaitan dengan bahasa lain, tetapi sepertinya saya tidak dapat menemukan versi definitif untuk ECMAScript.