我如何检查如果一个变量是一个整数在JavaScript,并抛出一个警告,如果它不是?我试过了,但不管用:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
我如何检查如果一个变量是一个整数在JavaScript,并抛出一个警告,如果它不是?我试过了,但不管用:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
当前回答
检查像poster这样的整数是否需要:
if (+data===parseInt(data)) {return true} else {return false}
注意+在data前面(将字符串转换为数字),===表示精确。
下面是一些例子:
data=10
+data===parseInt(data)
true
data="10"
+data===parseInt(data)
true
data="10.2"
+data===parseInt(data)
false
其他回答
你可以使用这个函数:
function isInteger(value) {
return (value == parseInt(value));
}
即使值是包含整数值的字符串,它也将返回true。 因此,结果将是:
alert(isInteger(1)); // true
alert(isInteger(1.2)); // false
alert(isInteger("1")); // true
alert(isInteger("1.2")); // false
alert(isInteger("abc")); // false
你可以使用一个简单的正则表达式:
function isInt(value) {
var er = /^-?[0-9]+$/;
return er.test(value);
}
你也可以试试这种方法
var data = 22;
if (Number.isInteger(data)) {
console.log("integer");
}else{
console.log("not an integer");
}
or
if (data === parseInt(data, 10)){
console.log("integer");
}else{
console.log("not an integer");
}
我的方法:
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 ) )
大整数(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'))