如何检查JavaScript中的变量是否为整数,如果不是,则引发警报?我试过了,但是不起作用:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
Number.isInteger
这是最简单的方法。
如何检查JavaScript中的变量是否为整数,如果不是,则引发警报?我试过了,但是不起作用:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
Number.isInteger
这是最简单的方法。
Answers:
使用===运算符(严格等于),如下所示,
if (data === parseInt(data, 10))
alert("data is integer")
else
alert("data is not an integer")
2.0 === 2
由于不必要的小数点只是同一数字的不同表示,因此parseInt(2.0) === 2.0
等同于parseInt(2) === 2
真实的情况
这取决于您是否还希望将字符串也转换为潜在整数?
这样可以:
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);
}
当然,我建议让Minifier处理。
假设您对所讨论的变量一无所知,则应采用以下方法:
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
}
简而言之:
if(typeof data==='number' && (data%1)===0) {
// data is an integer
}
"1.0"
是一个字符串,因此不是数字。1
如果这样设置,否则将是变量的值,var my_var=1.0;
此函数正确将其标识为整数。
Number.isInteger()
它将起作用……直到那时,这是一个很好的方法
Number.isInteger()
似乎是要走的路。
MDN还为不支持的浏览器提供了以下polyfill Number.isInteger()
(主要是IE的所有版本)。
Number.isInteger = Number.isInteger || function(value) {
return typeof value === "number" &&
isFinite(value) &&
Math.floor(value) === value;
};
您可以检查数字是否有余数:
var data = 22;
if(data % 1 === 0){
// yes it's an integer.
}
请注意,如果您输入的内容也可以是文本,并且您要首先检查它是否不是文本,那么可以先检查类型:
var data = 22;
if(typeof data === 'number'){
// yes it is numeric
if(data % 1 === 0){
// yes it's an integer.
}
}
0 % 1 === 0
在控制台中运行 。它true
作为0 % 1
回报返回0
。
0 % 1
返回0
在IE9,IE8和IE7兼容模式。
您可以使用一个简单的正则表达式:
function isInt(value) {
var er = /^-?[0-9]+$/;
return er.test(value);
}
首先,NaN是一个“数字”(是的,我知道这很奇怪,随它滚动),而不是一个“函数”。
您需要检查变量的类型是否为数字,并且要检查整数我将使用模数。
alert(typeof data === 'number' && data%1 == 0);
(0 == 0 || 0 % 1 == 0)
将评估为true
。
0 % 1 == 0
还算true
!%
不是师!
使用时要小心
num%1
空字符串('')或布尔值(true或false)将作为整数返回。您可能不想这样做
false % 1 // true
'' % 1 //true
Number.isInteger(22); //true
Number.isInteger(22.2); //false
Number.isInteger('22'); //false
浏览器中的内置功能。Dosnt支持较旧的浏览器
备择方案:
Math.round(num)=== num
但是,对于空字符串和布尔值,Math.round()也将失败
要检查像海报这样的整数是否要:
if (+data===parseInt(data)) {return true} else {return false}
在数据前注意+(将字符串转换为数字),而===表示精确。
以下是示例:
data=10
+data===parseInt(data)
true
data="10"
+data===parseInt(data)
true
data="10.2"
+data===parseInt(data)
false
return (+data===parseInt(data))
呢?
if(Number.isInteger(Number(data))){
//-----
}
以下是最简单,最干净的ECMAScript-6之前的解决方案(即使将非数字值(例如字符串或null)传递给该函数,它也足够健壮以返回false):
function isInteger(x) { return (x^0) === x; }
以下解决方案也可以使用,尽管不如上面的解决方案那么优雅:
function isInteger(x) { return Math.round(x) === x; }
注意,在上述实现中,可以很好地使用Math.ceil()或Math.floor()(而不是Math.round())。
或者:
function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); }
一种相当普遍的错误解决方案如下:
function isInteger(x) { return parseInt(x, 10) === x; }
尽管这种基于parseInt的方法对于x的许多值都可以很好地工作,但是一旦x变得很大,它将无法正常工作。问题在于parseInt()在解析数字之前将其第一个参数强制转换为字符串。因此,一旦数字变得足够大,其字符串表示形式将以指数形式(例如1e + 21)呈现。因此,parseInt()然后将尝试解析1e + 21,但是在到达e字符时将停止解析,因此将返回值1。请注意:
> String(1000000000000000000000)
'1e+21'
> parseInt(1000000000000000000000, 10)
1
> parseInt(1000000000000000000000, 10) === 1000000000000000000000
false
为什么没有人提到 Number.isInteger()
?
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
非常适合我,并NaN
以数字开头解决问题。
Number.isInteger()
,比您早3.5年:stackoverflow.com/a/27424770/5208540
ECMA-262 6.0(ES6)标准包括Number.isInteger函数。
为了增加对旧浏览器的支持,我强烈建议您使用以下强大且受社区支持的解决方案:
https://github.com/paulmillr/es6-shim
这是纯ES6 JS polyfills库。
请注意,此库需要es5-shim,只需遵循README.md。
您可以尝试Number.isInteger(Number(value))
是否value
使用字符串形式的整数,例如,var value = "23"
并且希望该值求和true
。避免尝试,Number.isInteger(parseInt(value))
因为这不会总是返回正确的值。例如,如果var value = "23abc"
您使用parseInt
实现,它将仍然返回true。
但是,如果您想要严格的整数值,那么Number.isInteger(value)
应该可以解决问题。
检查变量是否等于舍入为整数的相同变量,如下所示:
if(Math.round(data) != data) {
alert("Variable is not an integer!");
}
true
for来解决此函数的问题。之所以可行,是因为这是JavaScript中唯一不等于自身的值。例如,新代码应为NaN
!=
!==
if
NaN
if (Math.round(x) === x) { /* x IS an integer! */ }
此外,Number.isInteger()
。也许这里Number.isSafeInteger()
是另一个选择通过使用ES6规范,。
要Number.isSafeInteger(..)
在ES6之前的浏览器中填充:
Number.isSafeInteger = Number.isSafeInteger || function(num) {
return typeof num === "number" &&
isFinite(num) &&
Math.floor(num) === num &&
Math.abs( num ) <= Number.MAX_SAFE_INTEGER;
};
Number.isInteger()
是您的浏览器支持的最好方法,如果没有,我认为有很多方法可以解决:
function isInt1(value){
return (value^0) === value
}
要么:
function isInt2(value){
return (typeof value === 'number') && (value % 1 === 0);
}
要么:
function isInt3(value){
return parseInt(value, 10) === value;
}
要么:
function isInt4(value){
return Math.round(value) === value;
}
现在我们可以测试结果:
var value = 1
isInt1(value) // return true
isInt2(value) // return true
isInt3(value) // return true
isInt4(value) // return true
var value = 1.1
isInt1(value) // return false
isInt2(value) // return false
isInt3(value) // return false
isInt4(value) // return false
var value = 1000000000000000000
isInt1(value) // return false
isInt2(value) // return true
isInt3(value) // return false
isInt4(value) // return true
var value = undefined
isInt1(value) // return false
isInt2(value) // return false
isInt3(value) // return false
isInt4(value) // return false
var value = '1' //number as string
isInt1(value) // return false
isInt2(value) // return false
isInt3(value) // return false
isInt4(value) // return false
因此,所有这些方法都是可行的,但是当数量很大时,parseInt和^运算符将无法正常工作。
a >= 1e+21
测试只能通过必须为数字的值,并且非常大。这肯定会涵盖所有情况,这与本讨论中提供的其他解决方案不同。
a === (a|0)
如果给定函数的参数与按位转换的值完全(===)相同,则表示该参数是整数。
a|0
将返回0
对于任何值a
是不是数字,如果a
确实是一个数字,它会在小数点后剥去任何东西,所以1.0001
会成为1
function isInteger(a){
return a >= 1e+21 ? true : a === (a|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( a => console.log(typeof a, a, isInteger(a)) )
从http://www.toptal.com/javascript/interview-questions:
function isInteger(x) { return (x^0) === x; }
发现它是执行此操作的最佳方法。
使用|
运算符:
(5.3 | 0) === 5.3 // => false
(5.0 | 0) === 5.0 // => true
因此,测试功能可能如下所示:
var isInteger = function (value) {
if (typeof value !== 'number') {
return false;
}
if ((value | 0) !== value) {
return false;
}
return true;
};
这将解决另一种情况(121.),最后一个点
function isInt(value) {
var ind = value.indexOf(".");
if (ind > -1) { return false; }
if (isNaN(value)) {
return false;
}
var x = parseFloat(value);
return (x | 0) === x;
}
好的,原因是没有描述我的示例,所以更多示例:):
我使用正则表达式和测试方法:
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);
你也可以这样尝试
var data = 22;
if (Number.isInteger(data)) {
console.log("integer");
}else{
console.log("not an integer");
}
要么
if (data === parseInt(data, 10)){
console.log("integer");
}else{
console.log("not an integer");
}
data=22.5;
。而且两个分支机构都有console.log("not an integer")
:: S
我必须检查变量(字符串或数字)是否为整数,并使用了以下条件:
function isInt(a){
return !isNaN(a) && parseInt(a) == parseFloat(a);
}
http://jsfiddle.net/e267369d/1/
一些其他的答案中有一个类似的解决方案(依靠parseFloat
联合isNaN
),但是我的应该更直接,更容易解释。
编辑:我发现我的方法对于包含逗号的字符串失败(例如“ 1,2”),并且我还意识到在我的特殊情况下,如果字符串不是有效的整数,我希望函数失败(应该在任何浮点数上失败) ,甚至是1.0)。这是我的功能Mk II:
function isInt(a){
return !isNaN(a) && parseInt(a) == parseFloat(a) && (typeof a != 'string' || (a.indexOf('.') == -1 && a.indexOf(',') == -1));
}
http://jsfiddle.net/e267369d/3/
当然,如果您确实需要接受整数浮点数(1.0填充)的函数,则可以随时删除点条件a.indexOf('.') == -1
。
parseInt
。