代码之家  ›  专栏  ›  技术社区  ›  NullPointer

有多少种方法可以检查x是否为整数,哪种方法最有效?

  •  0
  • NullPointer  · 技术社区  · 6 年前

    我已经查过了 what is the best way to check variable type in javascript 问题是这样的,但没有找到我问题的答案。

    在javascript中,有多少种方法可以找到输入类型是否为整数?哪一个有效?

    我正在寻找在javascript中找到整数的方法,并找到了许多这样做的方法:

    1. 使用 typeof

    function isInteger(x) 
    { 
       return (typeof x === 'number') && (x % 1 === 0); 
       
    }
    console.log(isInteger(10));
    console.log(isInteger(10.1))
    1. 使用 parseInt

    function isInteger(x) 
    { 
       return parseInt(x, 10) === x; 
       
    }
    console.log(isInteger(10));
    console.log(isInteger(10.1));
    1. 使用 Math.round

    function isInteger(x)
    { 
      return Math.round(x) === x; 
      
    }
    console.log(isInteger(10));
    console.log(isInteger(10.1));

    有没有其他方法可以找到整数的类型,哪种方法对于小到大的整数值最有效。

    4 回复  |  直到 6 年前
        1
  •  3
  •   Ahmed Bajra    6 年前

    最直观的是 Number.isInteger() ,至少在我看来

    function isInteger(x)
    { 
      return Number.isInteger(x); 
      
    }
    console.log(isInteger(10)); // Output: True
    console.log(isInteger(10.1)); // Output: False

    编辑

    至于效率,我在jsben.ch上创建了一个基准测试,在这里我尝试了您的所有方法,您可以自己看到;)

    Link

        2
  •  2
  •   Axel    6 年前

    我刚刚测试了每个代码的速度 JSBEN.CH

    typeof => 347 ms
    
    parseInt => 338 ms
    
    Math.round => 367 ms
    

    有趣的是, parseInt 是最快的方法!

    只是速度比较。与 Number.isInteger(x) 相反!这是最快的本能反应。

        3
  •  1
  •   Romain Valeri    6 年前

    你的提议看起来不错,但让我们补充一下polyfill mozilla提出的:

    Number.isInteger = Number.isInteger || function(value) {
        return typeof value === 'number' && 
        isFinite(value) && 
        Math.floor(value) === value;
    };
    
        4
  •  1
  •   NullPointer    6 年前

    经过反复研究,我得出了这个问题的结论

    ECMAscript 6 它引入了一个新的 Number.isInteger() 正是为了这个目的。

    但是,在 ECMAscript 6 ,这有点复杂,因为 编号.isinteger() 提供方法。

    最简单最干净 pre-ECMAScript-6 解决方案(即使传递给函数的是字符串或null等非数值值,也足够健壮地返回false)是 bitwise XOR operator 以下内容:

    function isInteger(x) 
    { 
      return (x ^ 0) === x; 
    } 
    

    其他人喜欢 Math.round() 我是说, typeof parseInt 也可以用来找到 Integer 是的。

    而这个 帕森特 -基于的方法对于 x ,一次 变大了,就不能正常工作了。问题是 parseInt() 在分析数字之前,将其第一个参数强制为字符串。因此,一旦数字足够大,其字符串表示将以指数形式呈现(例如, 1e+21 )中。因此, parseInt() 然后将尝试分析 1E+21级 ,但当它到达e字符时将停止解析,因此将返回值 1 是的。