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

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

当前回答

我的方法:

a >= 1e+21→只适用于非常大的数字。这将肯定涵盖所有情况,不像本讨论中提供的其他解决方案。

A === (A |0)→如果给定函数的实参与按位转换的值完全相同(===),则意味着实参是一个整数。

A |0→对于A的任何非数字值都返回0,如果A确实是数字,它将去掉小数点后的所有数字,因此1.0001将变成1

const isInteger = n => n >= 1e+21 ? true : n === (n|0); // tests: [ [1, true], [1000000000000000000000, true], [4e2, true], [Infinity, true], [1.0, true], [1.0000000000001, false], [0.1, false], ["0", false], ["1", false], ["1.1", false], [NaN, false], [[], false], [{}, false], [true, false], [false, false], [null, false], [undefined, false], ].forEach(([test, expected]) => console.log( isInteger(test) === expected, typeof test, test ) )

其他回答

首先,NaN是一个“数字”(是的,我知道这很奇怪,就这样吧),而不是一个“函数”。

你需要检查变量的类型是否为数字,如果是整数,我会使用模数。

alert(typeof data === 'number' && data%1 == 0);

好的,得到负号,因为没有描述我的例子,所以更多的例子:):

我使用正则表达式和测试方法:

var isInteger = /^[0-9]\d*$/;

isInteger.test(123); //true
isInteger.test('123'); // true
isInteger.test('sdf'); //false
isInteger.test('123sdf'); //false

// If u want to avoid string value:
typeof testVal !== 'string' && isInteger.test(testValue);

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

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

大整数(bigint)呢?

大多数这些答案在大整数(253或更大)上失败:(x | 0) === x),测试typeof x === 'number',常规int函数(例如parseInt),常规算术在大整数上失败。这可以通过使用BigInt来解决。

我将几个答案编译成一个代码片段以显示结果。对于大整数,大多数完全失败,而其他的则可以,除非传入BigInt类型(例如1n)。我没有包括重复的答案,也没有任何答案,允许小数或不试图测试类型)

// these all fail n = 1000000000000000000000000000000 b = 1n // These all fail on large integers //https://stackoverflow.com/a/14636652/3600709 console.log('fail',1,n === parseInt(n, 10)) //https://stackoverflow.com/a/14794066/3600709 console.log('fail',2,!isNaN(n) && parseInt(Number(n)) == n && !isNaN(parseInt(n, 10))) console.log('fail',2,!isNaN(n) && (parseFloat(n) | 0) === parseFloat(n)) console.log('fail',2,!isNaN(n) && (function(x) { return (x | 0) === x; })(parseFloat(n))) //https://stackoverflow.com/a/21742529/3600709 console.log('fail',3,n == ~~n) //https://stackoverflow.com/a/28211631/3600709 console.log('fail',4,!isNaN(n) && parseInt(n) == parseFloat(n)) //https://stackoverflow.com/a/41854178/3600709 console.log('fail',5,String(parseInt(n, 10)) === String(n)) // These ones work for integers, but not BigInt types (e.g. 1n) //https://stackoverflow.com/a/14636725/3600709 console.log('partial',1,typeof n==='number' && (n%1)===0) // this one works console.log('partial',1,typeof b==='number' && (b%1)===0) // this one fails //https://stackoverflow.com/a/27424770/3600709 console.log('partial',2,Number.isInteger(n)) // this one works console.log('partial',2,Number.isInteger(b)) // this one fails //https://stackoverflow.com/a/14636638/3600709 console.log('partial',3,n % 1 === 0) console.log('partial',3,b % 1 === 0) // gives uncaught type on BigInt

检查类型

如果你真的想测试输入值的类型,以确保它是一个整数,可以使用下面的方法:

function isInt(value) {
    try {
        BigInt(value)
        return !['string','object','boolean'].includes(typeof value)
    } catch(e) {
        return false
    }
}

function isInt(value) { try { BigInt(value) return !['string','object','boolean'].includes(typeof value) } catch(e) { return false } } console.log('--- should be false') console.log(isInt(undefined)) console.log(isInt('')) console.log(isInt(null)) console.log(isInt({})) console.log(isInt([])) console.log(isInt(1.1e-1)) console.log(isInt(1.1)) console.log(isInt(true)) console.log(isInt(NaN)) console.log(isInt('1')) console.log(isInt(function(){})) console.log(isInt(Infinity)) console.log('--- should be true') console.log(isInt(10)) console.log(isInt(0x11)) console.log(isInt(0)) console.log(isInt(-10000)) console.log(isInt(100000000000000000000000000000000000000)) console.log(isInt(1n))


不检查类型

如果你不关心传入类型是否实际上是布尔值、字符串等转换成数字,那么只需使用以下方法:

function isInt(value) {
    try {
        BigInt(value)
        return true
    } catch(e) {
        return false
    }
}

function isInt(value) { try { BigInt(value) return true } catch(e) { return false } } console.log('--- should be false') console.log(isInt(undefined)) console.log(isInt(null)) console.log(isInt({})) console.log(isInt(1.1e-1)) console.log(isInt(1.1)) console.log(isInt(NaN)) console.log(isInt(function(){})) console.log(isInt(Infinity)) console.log('--- should be true') console.log(isInt(10)) console.log(isInt(0x11)) console.log(isInt(0)) console.log(isInt(-10000)) console.log(isInt(100000000000000000000000000000000000000)) console.log(isInt(1n)) // gets converted to number console.log(isInt('')) console.log(isInt([])) console.log(isInt(true)) console.log(isInt('1'))

“公认的”答案是错误的(如下面的一些评论所指出的)。 这个修改可以使它工作:

if (data.toString() === parseInt(data, 10).toString())
    alert("data is a valid integer")
else
    alert("data is not a valid integer")