如何检查变量是否是JavaScript中的整数?

JBa*_*JBa 382 javascript

如何在JavaScript中检查变量是否为整数,如果不是则抛出警报?我试过这个,但它不起作用:

<html>
    <head>
        <script type="text/javascript">
            var data = 22;
            alert(NaN(data));
        </script>
    </head>
</html>
Run Code Online (Sandbox Code Playgroud)

kri*_*isk 477

这取决于,您是否也想将字符串转换为潜在的整数?

这样做:

function isInt(value) {
  return !isNaN(value) && 
         parseInt(Number(value)) == value && 
         !isNaN(parseInt(value, 10));
}
Run Code Online (Sandbox Code Playgroud)

使用Bitwise操作

简单的解析和检查

function isInt(value) {
  var x = parseFloat(value);
  return !isNaN(value) && (x | 0) === x;
}
Run Code Online (Sandbox Code Playgroud)

短路并保存解析操作:

function isInt(value) {
  if (isNaN(value)) {
    return false;
  }
  var x = parseFloat(value);
  return (x | 0) === x;
}
Run Code Online (Sandbox Code Playgroud)

或者两者兼而有之:

function isInt(value) {
  return !isNaN(value) && (function(x) { return (x | 0) === x; })(parseFloat(value))
}
Run Code Online (Sandbox Code Playgroud)

测试:

isInt(42)        // true
isInt("42")      // true
isInt(4e2)       // true
isInt("4e2")     // true
isInt(" 1 ")     // true
isInt("")        // false
isInt("  ")      // false
isInt(42.1)      // false
isInt("1a")      // false
isInt("4e2a")    // false
isInt(null)      // false
isInt(undefined) // false
isInt(NaN)       // false
Run Code Online (Sandbox Code Playgroud)

这是小提琴:http://jsfiddle.net/opfyrqwp/28/

性能

测试表明,短路解决方案具有最佳性能(ops/sec).

// Short-circuiting, and saving a parse operation
function isInt(value) {
  var x;
  if (isNaN(value)) {
    return false;
  }
  x = parseFloat(value);
  return (x | 0) === x;
}
Run Code Online (Sandbox Code Playgroud)

这是一个基准:http: //jsben.ch/#/htLVw

如果你想要一种更短,更钝的短路形式:

function isInt(value) {
  var x;
  return isNaN(value) ? !1 : (x = parseFloat(value), (0 | x) === x);
}
Run Code Online (Sandbox Code Playgroud)

当然,我建议让迷你者来处理.

  • @krisk - 为多种解决方案提供支持.还对您提供的4种变体进行了快速测试:http://jsperf.com/tfm-is-integer - 并确定短路解决方案具有最佳性能. (4认同)
  • 它在 2099999999999999 上返回 false :-*(* (2认同)
  • 这就是“2”。评估为真 (2认同)

pra*_*nag 326

使用===运算符(严格相等),如下所示,

if (data === parseInt(data, 10))
    alert("data is integer")
else
    alert("data is not an integer")
Run Code Online (Sandbox Code Playgroud)

  • 这将NaN计为整数.对我的方法也表现更差.http://jsperf.com/numbers-and-integers (88认同)
  • 使用:(Number(a)=== parseInt(a))因为它们捕获了彼此的异常...... (7认同)
  • @connorbode在javascript中所有数字都有相同的类型(没有float或double),所以`2.0 === 2`因为不必要的十进制只是同一个数字的不同表示,因此`parseInt(2.0)=== 2.0`相当于`parseInt(2)=== 2`,这是真的 (4认同)
  • 这是一个坏主意。请参阅 http://www.2ality.com/2014/05/is-integer.html (1.4)。`parseInt()` 强制转换为字符串,对于大数,它不会像你期望的那样:`console.log(1000000000000000000000);` =&gt; `1e+21`。有很多更好的方法,例如`const isInteger = val =&gt; val%1==0`。 (4认同)
  • 如果你通过上面的代码运行你的例子它会提醒一个整数而另一个不是一个整数就是这种情况......在NaN的情况下,NaN的类型也不同于pareInt的返回值的类型()..... (2认同)
  • 我投票赞成完全删除这个答案。 (2认同)

Bla*_*lia 118

假设您对相关变量一无所知,则应采用以下方法:

if(typeof data === 'number') {
    var remainder = (data % 1);
    if(remainder === 0) {
        // yes, it is an integer
    }
    else if(isNaN(remainder)) {
        // no, data is either: NaN, Infinity, or -Infinity
    }
    else {
        // no, it is a float (still a number though)
    }
}
else {
    // no way, it is not even a number
}
Run Code Online (Sandbox Code Playgroud)

简而言之:

if(typeof data==='number' && (data%1)===0) {
    // data is an integer
}
Run Code Online (Sandbox Code Playgroud)

  • 你什么意思?这将检查javascript中的数据类型,"1.0"`是一个字符串,因此不是数字.否则`1`将是变量的值,如果你设置它`var my_var = 1.0;`,它被这个函数正确地标识为整数. (8认同)
  • 很快,[`Number.isInteger()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger)将起作用......直到那时,这是这是一个很好的方法 (4认同)

Wal*_*man 95

Number.isInteger() 似乎是要走的路.

MDN还为不支持的浏览器提供了以下polyfill Number.isInteger(),主要是IE的所有版本.

链接到MDN页面

Number.isInteger = Number.isInteger || function(value) {
    return typeof value === "number" && 
           isFinite(value) && 
           Math.floor(value) === value;
};
Run Code Online (Sandbox Code Playgroud)

  • 这是最直接和“正确”的答案。我的意思是,JavaScript 已经有了检查整数的方法。没有必要写一个新的。isNaN() 测试数字,而不是整数。 (4认同)
  • @globewalldesk也许它回答了“如何检查数字是否是整数”的问题,但不是“变量是否是整数”的问题。例如字符串“1”。 (4认同)
  • MDN对9007199254740992进行了测试[已删除](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger$compare?locale=en-US&to=814547&from=679289) (2认同)

Nop*_*ope 64

您可以检查该号码是否有余数:

var data = 22;

if(data % 1 === 0){
   // yes it's an integer.
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的输入也可能是文本而您想先检查它不是,那么您可以先检查类型:

var data = 22;

if(typeof data === 'number'){
     // yes it is numeric

    if(data % 1 === 0){
       // yes it's an integer.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Erwinus:我认为你的事实搞得一团糟.当您将**除以**时,除非将零除以数字,否则会导致零除错.与IE的版本完全无关. (61认同)
  • @Erwinus:在控制台中运行`0%1 === 0`.它返回`true`,因为`0%1`返回'0`. (3认同)

Mar*_*ato 21

您可以使用简单的正则表达式:

function isInt(value) {
    var er = /^-?[0-9]+$/;
    return er.test(value);
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*hil 15

首先,NaN是一个"数字"(是的,我知道这很奇怪,只是滚动它),而不是"功能".

您需要检查变量的类型是否为数字,并检查整数,我将使用模数.

alert(typeof data === 'number' && data%1 == 0);
Run Code Online (Sandbox Code Playgroud)

  • @Erwinus 0%1仍然被1除. (19认同)
  • 应该是:alert(typeof data =='number'&&(data == 0 || data%1 == 0)); 避免被零除. (2认同)

Jha*_*bub 13

使用时要小心

num%1

空字符串('')或布尔值(true或false)将作为整数返回.你可能不想那样做

false % 1 // true
'' % 1 //true
Run Code Online (Sandbox Code Playgroud)

Number.isInteger(数据)

Number.isInteger(22); //true
Number.isInteger(22.2); //false
Number.isInteger('22'); //false
Run Code Online (Sandbox Code Playgroud)

在浏览器中构建功能.Dosnt支持旧浏览器

备择方案:

Math.round(num)=== num
Run Code Online (Sandbox Code Playgroud)

但是,Math.round()也会因空字符串和布尔值而失败


Ell*_*lle 7

检查变量是否等于舍入为整数的同一变量,如下所示:

if(Math.round(data) != data) {
    alert("Variable is not an integer!");
}
Run Code Online (Sandbox Code Playgroud)


use*_*749 7

检查像海报这样的整数是否需要:

if (+data===parseInt(data)) {return true} else {return false}
Run Code Online (Sandbox Code Playgroud)

通知+在数据前面(将字符串转换为数字),===表示精确.

以下是示例:

data=10
+data===parseInt(data)
true

data="10"
+data===parseInt(data)
true

data="10.2"
+data===parseInt(data)
false
Run Code Online (Sandbox Code Playgroud)

  • 对于我的情况来说这似乎是最聪明的解决方案(我不介意它是否是字符串中的整数).但是:为什么不去`return(+ data === parseInt(data))`? (6认同)

小智 6

if(Number.isInteger(Number(data))){
    //-----
}
Run Code Online (Sandbox Code Playgroud)


nig*_*hts 6

为什么没有人提到Number.isInteger()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

对我来说完美无缺,并以NaN一个数字开头解决问题.

  • 请注意,这是 ES6,因此[旧浏览器(如 IE &lt;= 11)不支持它。](https://caniuse.com/#search=isNaN) 上面的文档提供了一个 polyfill。 (3认同)

小智 5

最简单和最干净的ECMAScript-6前解决方案(即使将非数字值(如字符串或null)传递给函数,也足以返回false,如下所示:

function isInteger(x) { return (x^0) === x; } 
Run Code Online (Sandbox Code Playgroud)

以下解决方案也可以使用,但不如上面那样优雅:

function isInteger(x) { return Math.round(x) === x; }
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的实现中,Math.ceil()或Math.floor()可以同样使用(而不是Math.round()).

或者:

function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); }
Run Code Online (Sandbox Code Playgroud)

一个相当常见的错误解决方案如下:

function isInteger(x) { return parseInt(x, 10) === x; }
Run Code Online (Sandbox Code Playgroud)

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

> String(1000000000000000000000)
'1e+21'

> parseInt(1000000000000000000000, 10)
1

> parseInt(1000000000000000000000, 10) === 1000000000000000000000
false
Run Code Online (Sandbox Code Playgroud)


Aru*_*hla 5

在ES6中,为Number Object添加了2种新方法。

如果参数为整数,则Number.isInteger()方法在其中返回true。

用法示例:

Number.isInteger(10);        // returns true
Number.isInteger(10.5);      // returns false
Run Code Online (Sandbox Code Playgroud)

  • 请注意 MDN 上的评论:“对于可以表示为整数的浮点数,该方法还将返回 true。”。这取决于你需要什么。 (2认同)
  • 这一切都取决于您的需要。如果您正在检查表单 Number.isInteger('10'); 中的年龄字段;// false 不好。 (2认同)