慕哥6287543
2019-10-16 10:32:54
我決定使用非常簡單的算法創(chuàng)建簡單的isEven和isOdd函數(shù):function isEven(n) { n = Number(n); return n === 0 || !!(n && !(n%2));}function isOdd(n) { return isEven(Number(n) + 1);}如果n具有某些參數(shù),那是可以的,但是在許多情況下會失敗。因此,我著手創(chuàng)建健壯的函數(shù),以便在盡可能多的情況下提供正確的結(jié)果,以便僅測試javascript數(shù)字限制內(nèi)的整數(shù),其他所有結(jié)果均返回false(包括+和-無限)。注意零是偶數(shù)。// 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));誰能看到上述任何問題?是否有更好的版本(即更準確,更快或更簡潔而不被混淆)?有許多與其他語言有關(guān)的帖子,但是我似乎找不到ECMAScript的權(quán)威版本。
3 回答

GCT1015
TA貢獻1827條經(jīng)驗 獲得超4個贊
使用模數(shù):
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
return Math.abs(n % 2) == 1;
}
您可以使用以下命令檢查Javascript中的任何值是否可以強制轉(zhuǎn)換為數(shù)字:
Number.isFinite(parseFloat(n))
此檢查最好應(yīng)在isEven和isOdd函數(shù)外部進行,這樣您就不必在兩個函數(shù)中重復(fù)進行錯誤處理。

慕神8447489
TA貢獻1780條經(jīng)驗 獲得超1個贊
我更喜歡使用一點測試:
if(i & 1)
{
// ODD
}
else
{
// EVEN
}
這將測試是否在第一個位上表示一個奇數(shù)。

青春有我
TA貢獻1784條經(jīng)驗 獲得超8個贊
注意:也有負數(shù)。
function isOddInteger(n)
{
return isInteger(n) && (n % 2 !== 0);
}
哪里
function isInteger(n)
{
return n === parseInt(n, 10);
}
添加回答
舉報
0/150
提交
取消