测试值是奇数还是偶数

我决定使用非常简单的算法创建简单的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的权威版本。


慕哥6287543
浏览 619回答 3
3回答

GCT1015

使用模数:function isEven(n) {   return n % 2 == 0;}function isOdd(n) {   return Math.abs(n % 2) == 1;}您可以使用以下命令检查Javascript中的任何值是否可以强制转换为数字:Number.isFinite(parseFloat(n))此检查最好应在isEven和isOdd函数外部进行,这样您就不必在两个函数中重复进行错误处理。

慕神8447489

我更喜欢使用一点测试:if(i & 1){    // ODD}else{    // EVEN}这将测试是否在第一个位上表示一个奇数。

青春有我

注意:也有负数。function isOddInteger(n){   return isInteger(n) && (n % 2 !== 0);}哪里function isInteger(n){   return n === parseInt(n, 10);}
打开App,查看更多内容
随时随地看视频慕课网APP