JavaScript 中如何判断一个变量是否为整数?

IT技术 javascript
2021-01-11 19:16:00

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

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

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

这将:

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/

表现

测试表明,短路解决方案具有最佳性能(操作数/秒)。

// 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);
}

当然,我建议让压缩器来处理。

@krisk - 支持多种解决方案。还对您提供的 4 个变体进行了快速测试:jsperf.com/tfm-is-integer - 并确定短路解决方案具有最佳性能。
2021-03-15 19:16:00
这使得“2”。评估为真
2021-03-23 19:16:00
@jkucharovic 按位或运算符是罪魁祸首。使用非按位版本将返回 true。
2021-03-24 19:16:00
@cyberwombat 那是一个十进制数 2.0 :-)
2021-03-31 19:16:00
它在 2099999999999999 上返回 false :- (
2021-04-07 19:16:00

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

if (data === parseInt(data, 10))
    alert("data is integer")
else
    alert("data is not an integer")
这是一个坏主意。请参阅2ality.com/2014/05/is-integer.html (1.4)。parseInt()强制转换为字符串,对于大数,它不会按照您的预期执行:console.log(1000000000000000000000);=> 1e+21有很多更好的方法,例如const isInteger = val => val%1==0
2021-03-21 19:16:00
你能详细说明一下吗?“示例”仅表明使用 parseInt 比使用 typeof 关键字和模数运算符产生更差的性能。但我确实明白你现在的意思 (NaN != NaN)
2021-03-29 19:16:00
如果你通过上面的代码运行你的例子,它会提醒一个整数,另一个不是整数,就是这种情况......在 NaN 的情况下,NaN 的类型也不同于 pareInt 的返回值的类型(.....
2021-03-31 19:16:00
javascript中的@connorbode所有数字都具有相同的类型(没有浮点数或双精度数),因此2.0 === 2由于不必要的小数只是同一数字的不同表示,因此parseInt(2.0) === 2.0相当于parseInt(2) === 2哪个为真
2021-04-07 19:16:00
@BlakeRegalia:虽然他的方法很快,但他的方法并没有从这个答案中传递所有可能的值:stackoverflow.com/a/14794066/843732
2021-04-10 19:16:00

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

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
}
很快,Number.isInteger()将工作......在那之前,这是一个很好的方法
2021-03-21 19:16:00
Number.isInteger 对我不起作用。我一定做错了什么。Blake 的解决方案 %1 完美运行。
2021-04-02 19:16:00
你是什​​么意思?这会检查 javascript 中的数据类型,它"1.0"是一个字符串,因此不是数字。否则1将是一个变量的值,如果你如此设置它var my_var=1.0;,它被这个函数正确识别为一个整数。
2021-04-04 19:16:00

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

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

链接到 MDN 页面

Number.isInteger = Number.isInteger || function(value) {
    return typeof value === "number" && 
           isFinite(value) && 
           Math.floor(value) === value;
};
MDN删除了对 9007199254740992 的测试
2021-03-18 19:16:00
这是最直接和“正确”的答案。我的意思是,JavaScript 已经有了检查整数的方法。没有必要写一个新的。isNaN() 测试数字,而不是整数。
2021-03-22 19:16:00
@Onkeltem Number.isInteger("1")
2021-03-31 19:16:00
@globewalldesk 也许它回答了“如何检查数字是否为整数”而不是“如果变量为整数”的问题。例如,字符串“1”。
2021-04-05 19:16:00
@WalterRoman 为什么?它返回false,而我期望true例如,解析像product/24/edit. 解析后,您会得到一个类似 的数组["product", 24, "edit"],其中"24"最有可能是 的整数24
2021-04-07 19:16:00

您可以检查数字是否有余数:

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.
    }
}