一些与您的代码不同的示例:
'0x12'
因为Number()和parseInt()都尝试对数字进行 JavaScript 样式解析 - 在这种情况下将数字解析为十六进制,所以这会失败。(但也许你对此没意见)。将 10 作为基数传递给 parseInt 的简单更改将修复这部分代码。
'1.0000000000000001' 这会出错,因为 JavaScript 数字无法存储足够的有效数字来表示这个数字。
我建议做两项检查,一项检查数字,一项检查字符串。对于数字,您可以取floor()以查看四舍五入时数字是否发生变化。对于字符串,使用RegExp检查字符串是否仅包含“-”和数字。就像是:
function isint(o) {
if (typeof o === 'number') {
// o is an int if rounding down doesn't change it.
return Math.floor(o) === o;
}
else if (typeof o === 'string' &&
/^-?\d+$/.test(o)) { // match '-' (optional) followed by 1 or more digits
// o is an int if parsing the string, and toString()ing it gets you the same value
var num = Number(o);
return num.toString() === o;
}
return false;
}
尝试一下:
[12, 13, '14', '-1', '0x12', '1.0000000000000001'].forEach(function(x) {
console.log(x + ' isInt = ' + isint(x));
});
印刷:
12 isInt = true
13 isInt = true
14 isInt = true
-1 isInt = true
0x12 isInt = false
1.0000000000000001 isInt = false