【问题标题】:how many ways to check if x is integer and which one is most efficient?有多少种方法可以检查 x 是否为整数,哪一种最有效?
【发布时间】:2018-07-17 14:58:50
【问题描述】:

我已经检查过what is the best way to check variable type in javascript 关于 So 的问题,但没有找到我的问题的答案。

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

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

【问题讨论】:

  • parseInt() 是一种笨拙的做法,因为它所做的第一件事就是将数字转换为字符串。
  • 也试试跑速测试!

标签: javascript integer


【解决方案1】:

最直观的是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

【讨论】:

  • 为什么有什么具体原因?它适合长整数值吗?
  • 恐怕这在 IE 上不受支持(见here
  • 可惜 IE 不支持它。我认为这是最直观的,因为它明确地说明了它在做什么,而不是隐藏在一些数学或编程技巧之后。
  • 在您看来 Number.isInteger() 是最好的,但是您的基准测试表明 typeof.i 很混乱
  • @NullPointer 嗯,我运行了几次,似乎很不一致。
【解决方案2】:

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

typeof => 347 ms

parseInt => 338 ms

Math.round => 367 ms

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

这只是速度比较。改用Number.isInteger(x)!这是本能和最快的。

【讨论】:

  • by pointy in cmets>parseInt() 是一种笨拙的方法,因为它所做的第一件事就是将数字转换为字符串
  • 再一次,仅当您不关心 IE 兼容性时才使用 Number.isInteger(此处不支持)。此外,非常感谢替补席。
  • parseInt 也适用于字符串,因此应使用 Number.isInteger 并为 IE 添加 polyfill 将是正确的解决方案。
【解决方案3】:

您的提议看起来不错,但让我们添加 Mozilla 提出的 polyfill 以完成:

Number.isInteger = Number.isInteger || function(value) {
    return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

【讨论】:

    【解决方案4】:

    经过一番研究,我得出了这个问题的答案

    来自 ECMAscript 6,它引入了一个新的 Number.isInteger() 函数来实现这个目的。

    但是,在 ECMAScript 6 之前,这有点复杂,因为没有提供等效的 Number.isInteger() 方法。

    最简单和最干净的pre-ECMAScript-6 解决方案(即使将非数字值(例如字符串或空值)传递给函数也足够强大以返回false)将是bitwise XOR operator 的以下用法:

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

    Math.round()typeofparseInt 等其他名称也可用于查找Integer

    虽然这种基于parseInt 的方法适用于x 的许多值,但一旦x 变得相当大,它将无法正常工作。问题是parseInt() 在解析数字之前将其第一个参数强制转换为字符串。因此,一旦数字变得足够大,其字符串表示将以指数形式呈现(例如,1e+21)。因此,parseInt() 将尝试解析 1e+21,但在到达 e 字符时将停止解析,因此将返回值 1

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2013-10-20
      • 1970-01-01
      • 2019-05-13
      • 2020-11-16
      • 2019-10-21
      相关资源
      最近更新 更多