我如何检查如果一个变量是一个整数在JavaScript,并抛出一个警告,如果它不是?我试过了,但不管用:

<html>
    <head>
        <script type="text/javascript">
            var data = 22;
            alert(NaN(data));
        </script>
    </head>
</html>

当前回答

在经历了几次成功和失败之后,我想出了这个解决方案:

const isInt = (value) => {
  return String(parseInt(value, 10)) === String(value)
}

我喜欢上面的想法,检查不是NaN的值并使用parseFloat,但当我在React基础设施中尝试它时,由于某些原因它不起作用。

编辑: 我找到了一个不用字符串的更好的方法:

var isInt = function (str) {
  return str === '0' || !!~~str;
}

我认为这是最简短的答案。也许是最有效的,但我可以更正一下。:)

其他回答

这要看情况,你是否也想将字符串转换为潜在整数?

这样做:

function isInt(value) {
  return !isNaN(value) && 
         parseInt(Number(value)) == value && 
         !isNaN(parseInt(value, 10));
}

按位操作

简单的解析和检查

function isInt(value) {
  var x = parseFloat(value);
  return !isNaN(value) && (x | 0) === x;
}

短路并保存解析操作:

function isInt(value) {
  if (isNaN(value)) {
    return false;
  }
  var x = parseFloat(value);
  return (x | 0) === x;
}

或者两者同时出现:

function isInt(value) {
  return !isNaN(value) && (function(x) { return (x | 0) === x; })(parseFloat(value))
}

测试:

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

这是小提琴: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;
}

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

如果你喜欢更短的钝角短路形式:

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

当然了,我建议让这个小工具来处理。

在今天的浏览器中,Number.isInteger()是一种方式,就像之前解释的许多答案一样,但我遇到了一个常见的问题,它发生在我构建API的时候。

所以在API请求中,我们以字符串的形式接收属性,因此Number.isInteger()将返回false。

如果我们尝试用Number.isInteger(parseInt())检查它,那么值就像1.1或1。Asd返回true

为了解决这个问题,我创建了一个函数,它检查值是否为整数,将其作为整数或字符串传递

function isNumber(value) {
    return ([...value.toString()]
            .filter(x => [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' ]
            .indexOf(x) >= 0))
            .length == Math.max(value.toString().length, 1)
}

Math.max()部分用于处理空字符串

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

if (data === parseInt(data, 10))
    alert("data is integer")
else
    alert("data is not an integer")

Lodash https://lodash.com/docs#isInteger(自4.0.0起)有函数检查变量是否为整数:

_.isInteger(3);
// → true

_.isInteger(Number.MIN_VALUE);
// → false

_.isInteger(Infinity);
// → false

_.isInteger('3');
// → false

对于没有分隔符的正整数值:

return ( data !== '' && data === data.replace(/\D/, '') );

测试 1. 如果不是空的, 2. 如果value等于在其值中替换非数字字符的结果。