我决定使用非常简单的算法创建简单的 isEven 和 isOdd 函数:
function isEven(n) { n = Number(n); return n === 0 || !!(n && !(n%2)); } function isOdd(n) { return isEven(Number(n) + 1); }
如果n具有某些参数,那是可以的,但是在许多情况下会失败。因此,我着手创建健壮的函数,以便在尽可能多的情况下提供正确的结果,以便仅测试javascript数字范围内的整数,其他所有结果均返回false(包括+和-无限)。注意零是偶数。
// 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));
谁能看到上述任何问题?是否有更好的版本(即更准确,更快或更简洁而不被混淆)?
有许多与其他语言有关的帖子,但是我似乎找不到ECMAScript的权威版本。
使用模数:
function isEven(n) { return n % 2 == 0; } function isOdd(n) { return Math.abs(n % 2) == 1; }
您可以使用以下命令检查Javascript中的任何值是否可以强制转换为数字:
Number.isFinite(parseFloat(n)) This check should preferably be done outside the `isEven` and `isOdd` functions, so you don't have to duplicate error handling in both functions.