Çok basit bir algoritma ile basit isEven ve isOdd işlevi oluşturmaya karar verdim :
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
N belirli parametrelerde ise, ancak birçok senaryoda başarısız olursa sorun olmaz. Bu yüzden olabildiğince çok senaryo için doğru sonuçlar veren sağlam işlevler oluşturmaya başladım, böylece sadece javascript sayılarının sınırları içindeki tamsayılar test edildi, diğer her şey yanlış (+ ve - sonsuz dahil) döndürür. Sıfırın çift olduğunu unutmayın.
// 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));
Yukarıdakilerle ilgili herhangi bir sorun gören var mı? Daha iyi (gizlenmiş olmadan daha doğru, daha hızlı veya daha kısa) bir sürüm var mı?
Diğer dillerle ilgili çeşitli yayınlar var, ancak ECMAScript için kesin bir sürüm bulamıyorum.