testing一个值是奇数还是偶数

我决定用一个非常简单的algorithm来创build简单的isEvenisOdd函数:

function isEven(n) { n = Number(n); return n === 0 || !!(n && !(n%2)); } function isOdd(n) { return isEven(Number(n) + 1); } 

如果n具有某些参数,那么这是可以的,但是对于许多情况来说却失败 所以我着手创build强大的函数,为尽可能多的场景提供正确的结果,这样只有javascript数字范围内的整数才会被testing,其他的都会返回false(包括+和 – infinity)。 请注意,零是偶数。

 // 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)); 

任何人都可以看到上述的任何问题? 有没有更好的(即更准确,更快或更简洁而不被混淆)的版本?

有不同的职位与其他语言,但我似乎无法findECMAScript的权威版本。

编辑

代码审查标签被添加,但我没有经过代码审查。 我简单地发布了代码,以便其他人可以看到我在哪里,而不是作为审查的东西。 迄今为止发布的答案似乎得到了。

编辑2

最后的function,基于史蒂夫的答案:

 // Use abstract equality == for "is number" test function isEven(n) { return n == parseFloat(n)? !(n%2) : void 0; } // Use strict equality === for "is number" test function isEvenStrict(n) { return n === parseFloat(n)? !(n%2) : void 0; } 

任何不是数字的东西都会返回undefined ,数字会返回true或者false 。 这可能是一个严格的国旗function,但我认为严格的比较是不是真的需要。

使用模数:

 function isEven(n) { return n % 2 == 0; } function isOdd(n) { return Math.abs(n % 2) == 1; } 

你可以检查在JavaScript中的任何值可以被强制为一个数字:

 Number.isFinite(parseFloat(n)) 

这个检查最好在isEvenisOdd函数之外完成,所以你不必在两个函数中重复error handling。

我更喜欢使用一点testing:

 if(i & 1) { // ODD } else { // EVEN } 

这testing第一个位是否打开表示一个奇数。

以下情况如何? 我只在IE中testing了这个,但是处理表示任意长度的数字的string,实际的整数或浮点数,以及在传递一个布尔型,未定义,空值,数组或对象时返回false都是非常乐意的。 (由您决定是否忽略string传入时的前导空格或尾随空格 – 我假设它们不会被忽略并导致这两个函数返回false。)

 function isEven(n) { return /^-?\d*[02468]$/.test(n); } function isOdd(n) { return /^-?\d*[13579]$/.test(n); } 

注意: 也有负数。

 function isOddInteger(n) { return isInteger(n) && (n % 2 !== 0) ) ; } 

哪里

 function isInteger(n) { return n === parseInt(n); } 

为什么不这样做:

  function oddOrEven(num){ if(num % 2 == 0) return "even"; return "odd"; } oddOrEven(num); 
 var isEven = function(number) { // Your code goes here! if (number % 2 == 0){ return(true); } else{ return(false); } }; 

史蒂夫·梅恩的简单修改/改进的答案!

 function isEvenOrOdd(n){ if(n === parseFloat(n)){ return isNumber(n) && (n % 2 == 0); } return false; } 

注意:如果无效,则返回false!

不同的方式:

 var isEven = function(number) { // Your code goes here! if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;}; }; isEven(69) 

因为为什么不使用string

 function isEven(__num){ return String(__num/2).indexOf('.') === -1; } 
 if (testNum == 0); else if (testNum % 2 == 0); else if ((testNum % 2) != 0 ); 

要testing你是否有一个奇数或偶数,这也适用。

 const comapare = x => integer(checkNumber(x)); function checkNumber (x) { if (x % 2 == 0) { return true; } else if (x % 2 != 0) { return false; } } function integer (x) { if (x) { console.log('even'); } else { console.log('odd'); } } 

使用现代JavaScript风格:

 const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ") const isOdd = n=> NUMBERS[n % 10].indexOf("e")!=-1 const isEven = n=> isOdd(+n+1) 

这一个更简单!

  var num = 3 //instead get your value here var aa = ["Even", "Odd"]; alert(aa[num % 2]);