我已经检查了在javascript中检查变量类型的最佳方式关于So的问题,但并没有找到我问题的答案。
在javascript中,如果输入类型是integer,有多少种方法可以找到?哪一个是有效的?
我一直在寻找在javascript中找到整数的方法,并找到了很多方法:
- 使用
typeof
function isInteger(x)
{
return (typeof x === 'number') && (x % 1 === 0);
}
console.log(isInteger(10));
console.log(isInteger(10.1))
- 使用
parseInt
function isInteger(x)
{
return parseInt(x, 10) === x;
}
console.log(isInteger(10));
console.log(isInteger(10.1));
- 使用
Math.round
function isInteger(x)
{
return Math.round(x) === x;
}
console.log(isInteger(10));
console.log(isInteger(10.1));
有没有其他方法可以找到Integer的类型,以及哪种方法对于考虑从小到大的整数值最有效。
最直观的是Number.isIInteger((,至少在我看来是
function isInteger(x)
{
return Number.isInteger(x);
}
console.log(isInteger(10)); // Output: True
console.log(isInteger(10.1)); // Output: False
编辑
至于效率,我在jsben.ch上创建了一个基准,在那里我尝试了你和我的所有方法,你可以自己看到;(
链接
我刚刚在JSBEN.CH 上测试了每个代码的速度
typeof => 347 ms
parseInt => 338 ms
Math.round => 367 ms
有趣的是,parseInt
是最快的方式!
这只是速度比较。改为使用Number.isInteger(x)
!这是本能的&最快的。
您的主张似乎很好,但让我们补充一下polyfill Mozilla提出的内容:
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
我在重新研究后得出了这个问题的结论
来自ECMAscript 6,它正是为此目的引入了一个新的Number.isInteger()
函数。
但是,在ECMAScript 6之前,由于没有提供等效的Number.isInteger()
方法,所以这有点复杂。
最简单、最干净的pre-ECMAScript-6
解决方案(即使将字符串或null等非数字值传递给函数,它也足够健壮,可以返回false(是bitwise XOR operator
:的以下使用
function isInteger(x)
{
return (x ^ 0) === x;
}
其他如Math.round()
、typeof
和parseInt
也可以用于查找Integer
。
虽然这种基于
parseInt
的方法对x
的许多值都能很好地工作,但一旦x
变得很大,它将无法正常工作。问题是parseInt()
在解析数字之前将其第一个参数强制为字符串。因此,一旦数字变得足够大,其字符串表示将以指数形式呈现(例如,1e+21
(。因此,parseInt()
随后将尝试解析1e+21
,但当其达到e字符时将停止解析,因此将返回值1
。