如何找到一个数字是 float
或 integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
<nit-pick>
JavaScript 没有不同的整数和浮点数类型。 JavaScript 中的每个数字都只是一个 Number
。 </nit-pick>
Infinity
就您而言,是整数还是非整数值?这里的答案在这个分数上分布得相当均匀。
Infinity
视为整数。
1.0
整数还是浮点数?
除以 1 时检查余数:
function isInt(n) {
return n % 1 === 0;
}
如果你不知道参数是一个数字,你需要两个测试:
function isInt(n){
return Number(n) === n && n % 1 === 0;
}
function isFloat(n){
return Number(n) === n && n % 1 !== 0;
}
2019 年更新 在编写此答案 5 年后,ECMA Script 2015 中的解决方案已标准化。该解决方案已涵盖in this answer。
尝试使用这些函数来测试一个值是否是一个没有小数部分并且在可以表示为精确整数的大小限制内的数字原始值。
function isFloat(n) {
return n === +n && n !== (n|0);
}
function isInteger(n) {
return n === +n && n === (n|0);
}
n===+n
检查数字,n|0
进行舍入),但具有内置运算符。时髦的
parseFloat()
。
|
(OR) 这样的按位运算符仅对有符号的 32 位整数进行操作。 OP 没有说明目标是否是检查有符号的 int32 值。所以这不适用于超出范围的数字。 isInteger(5000000000)
将返回 false
,这是错误的!
有一个名为 Number.isInteger()
的方法,目前在除 IE 之外的所有应用程序中都实现了该方法。 MDN 还为其他浏览器提供了一个 polyfill:
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
但是,对于大多数用例,您最好使用 Number.isSafeInteger
,它还会检查值是否太高/太低以至于任何小数位都会丢失。 MDN 也为此提供了一个 polyfil。 (您还需要上面的 isInteger
pollyfill。)
if (!Number.MAX_SAFE_INTEGER) {
Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};
Number.isInteger(12.0) //true
(Chrome,2017 年 2 月)
12.0 ∈ ℤ
。
Number.isInteger
的正确 polyfill。但是,它是 Number.isSafeInteger
的正确 polyfill。 Number.isInteger
不应检查数字是否为“安全整数”。请参阅 MDN:isInteger 和 isSafeInteger。
为什么不这样:
var isInt = function(n) { return parseInt(n) === n };
您可以使用一个简单的正则表达式:
function isInt(value) {
var er = /^-?[0-9]+$/;
return er.test(value);
}
或者,您也可以根据需要使用以下功能。它们由 PHPJS Project 开发。
is_int()
=>检查变量类型是否为整数以及其内容是否为整数
is_float()
=>检查变量类型是否为浮点数以及其内容是否为浮点数
ctype_digit()
=>检查变量类型是否为字符串以及其内容是否只有十进制数字
更新 1
现在它也检查负数,感谢@ChrisBartley comment!
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
以下是检查值是数字还是可以安全地转换为数字的有效函数:
function isNumber(value) {
if ((undefined === value) || (null === value)) {
return false;
}
if (typeof value == 'number') {
return true;
}
return !isNaN(value - 0);
}
对于整数(如果值为浮点数,则返回 false):
function isInteger(value) {
if ((undefined === value) || (null === value)) {
return false;
}
return value % 1 == 0;
}
这里的效率是当值已经是数字时避免使用 parseInt(或 parseNumber)。这两个解析函数总是先转换为字符串,然后再尝试解析该字符串,如果值已经是数字,这将是一种浪费。
感谢您在这里的其他帖子为优化提供进一步的想法!
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }
// give it a spin
isInteger(1.0); // true
isFloat(1.0); // false
isFloat(1.2); // true
isInteger(1.2); // false
isFloat(1); // false
isInteger(1); // true
isFloat(2e+2); // false
isInteger(2e+2); // true
isFloat('1'); // false
isInteger('1'); // false
isFloat(NaN); // false
isInteger(NaN); // false
isFloat(null); // false
isInteger(null); // false
isFloat(undefined); // false
isInteger(undefined); // false
1.2
失败。始终使用 0.1 0.2 0.3 测试数值函数
function isInt(n)
{
return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
return n != "" && !isNaN(n) && Math.round(n) != n;
}
适用于所有情况。
isInt('1')
按预期返回 true
(至少对我而言)。不过,这很奇怪,这也将 true
返回到 isInt([5])
。对我来说没关系,但对你来说可能,所以,小心点。
这个怎么样?
isFloat(num) {
return typeof num === "number" && !Number.isInteger(num);
}
console.log(isFloat(1.0));
结果为假。
isFloat(NaN)
和 isFloat(Infinity)
返回 true:/
正如其他人提到的,您在 JS 中只有双打。那么你如何定义一个数字是一个整数呢?只需检查四舍五入的数字是否等于自身:
function isInteger(f) {
return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }
isFloat('abc')
返回 true
isFloat(NaN) // true
这是我用于整数的:
Math.ceil(parseFloat(val)) === val
简短,很好:) 一直有效。如果我没记错的话,这就是大卫弗拉纳根的建议。
parseFloat
?
!!(24%1) // false
!!(24.2%1) // true
!!(24.0%1)
为假
var isInt = function (n) { return n === (n | 0); };
没有一个案例,这没有做这项工作。
2
是一个整数,而 23
被认为是函数的第二个参数。在 javascript 中,小数是使用点作为分隔符写入的 - 所以它应该是 2.23
。
我们可以通过isInteger
函数检查。 ie number 将返回 true 并且 float 返回 false
console.log(Number.isInteger(2)),
将返回 true
console.log(Number.isInteger(2.5)) 将返回 false
这实际上取决于您想要实现的目标。如果您想“模拟”强类型语言,那么我建议您不要尝试。正如其他人提到的,所有数字都具有相同的表示形式(相同的类型)。
使用类似 Claudiu 提供的东西:
isInteger( 1.0 )
->真的
对于常识来说这看起来不错,但在 C 之类的语言中你会得到 false
任何小数部分为零的浮点数(例如 1.0、12.00、0.0)都会隐式转换为整数,因此无法检查它们是否为浮点数。
在这里尝试了一些答案,我最终写了这个解决方案。这也适用于字符串中的数字。
function isInt(number) {
if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
return !(number - parseInt(number));
}
function isFloat(number) {
if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
return number - parseInt(number) ? true : false;
}
var tests = {'integer':1,'float':1.1,'integerInString':'5','floatInString':'5.5','negativeInt':-345,'negativeFloat':-34.98,'negativeIntString': '-45','negativeFloatString':'-23.09','notValidFalse':假,'notValidTrue':真,'notValidString':'45lorem','notValidStringFloat':'4.5lorem','notValidNan':NaN,' notValidObj' : {}, 'notValidArr' : [1,2], };函数 isInt(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|' ]{0,1}$/.test(number)) 返回 false;返回!(数字 - parseInt(数字)); } function isFloat(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["| ']{0,1}$/.test(number)) 返回 false;返回数字 - parseInt(number) ?真假; } 功能 testFunctions(obj) { var keys = Object.keys(obj); var values = Object.values(obj); values.forEach(function(element, index){ console.log(`Is ${keys[index]} (${element}) var 一个整数吗?${isInt(element)}`); console.log(`Is ${keys[index]} (${element}) var a float? ${isFloat(element)}`); }); } 测试功能(测试);
简单整数测试:
if( n === parseInt(n) ) ...
有道理:如果 JavaScript 可以将某些东西转换为整数,并且通过转换它变成完全相同的东西,那么您的操作数就是整数。
控制台测试用例:
x = 1; x===parseInt(x); // true
x = "1"; x===parseInt(x); // false
x = 1.1; x===parseInt(x); // false, obviously
// BUT!
x = 1.0; x===parseInt(x); // true, because 1.0 is NOT a float!
这让很多人感到困惑。每当某物为 .0 时,它就不再是浮点数了。它是一个整数。或者您可以将其称为“数字事物”,因为没有像当时 C 中那样严格的区别。过去的美好时光。
所以基本上,你所能做的就是检查整数,接受 1.000 是整数的事实。
有趣的旁注
有一个关于巨大数字的评论。巨大的数字意味着这种方法没有问题;每当 parseInt 无法处理该数字(因为它太大)时,它将返回实际值以外的其他值,因此测试将返回 FALSE。看:
var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!
var aIsInteger = ( a===parseInt(a) )?"a is ok":"a fails";
var bIsInteger = ( b===parseInt(b) )?"b is ok":"b fails";
alert(aIsInteger+"; "+bIsInteger);
我在 2014 年在 IE8 上对此进行了测试,然后在 2021 年在 Chrome 上进行了测试,两者都返回“a 正常;b 失败”,这意味着如果一个数字太大,它就不能再是整数了。
引用经典的话,20 位数字对任何人来说都应该足够了。
Number.isInteger
的工作方式一致。
Number.isInteger
的工作方式一致。如另一个答案所示,单行测试是 n === (n | 0)
。
它真的不必那么复杂。整数的 parseFloat() 和 parseInt() 等效项的数值将相同。因此你可以这样做:
function isInt(value){
return (parseFloat(value) == parseInt(value)) && !isNaN(value);
}
然后
if (isInt(x)) // do work
这也将允许进行字符串检查,因此并不严格。如果想要一个强类型的解决方案(又名,不能使用字符串):
function is_int(value){ return !isNaN(parseInt(value * 1) }
这是检查整数和浮点数的最终代码
function isInt(n) {
if(typeof n == 'number' && Math.Round(n) % 1 == 0) {
return true;
} else {
return false;
}
}
或者
function isInt(n) {
return typeof n == 'number' && Math.Round(n) % 1 == 0;
}
function isInteger(n) {
return ((typeof n==='number')&&(n%1===0));
}
function isFloat(n) {
return ((typeof n==='number')&&(n%1!==0));
}
function isNumber(n) {
return (typeof n==='number');
}
这个解决方案对我有用。
<html>
<body>
<form method="post" action="#">
<input type="text" id="number_id"/>
<input type="submit" value="send"/>
</form>
<p id="message"></p>
<script>
var flt=document.getElementById("number_id").value;
if(isNaN(flt)==false && Number.isInteger(flt)==false)
{
document.getElementById("message").innerHTML="the number_id is a float ";
}
else
{
document.getElementById("message").innerHTML="the number_id is a Integer";
}
</script>
</body>
</html>
尝试这个
let n;
return (n = value % 1) !== 0 && !isNaN(n);
当返回值为 false 时表示输入值为浮点数或浮点字符串,否则输入值为整数 numbef 或整数字符串。
基本上它需要检查不等于零的精度值。
另一种是检查正确的字符串编号。
const integerCheck = (num) => {
const isInt = (n) => Number(n) === n && n % 1 === 0
const isFloat = (n) => Number(n) === n && n % 1 !== 0
return (isInt(num) || !isFloat(num))
}
console.log( integerCheck('23.3') );
对于整数我使用这个
function integer_or_null(value) {
if ((undefined === value) || (null === value)) {
return null;
}
if(value % 1 != 0) {
return null;
}
return value;
}
在 java 脚本中,所有数字都是 internally 64 bit floating point
,与 java 中的 double 相同。 javascript 中没有不同的类型,都由类型 number
表示。因此,您将无法进行 instanceof
检查。但是,您可以使用上述给出的解决方案来确定它是否是小数。 Java 脚本的设计者认为使用单一类型可以避免大量类型转换错误。
对于那些好奇的人,我使用 Benchmark.js 在这篇文章中测试了投票率最高的答案(以及今天发布的答案),这是我的结果:
var n = -10.4375892034758293405790;
var suite = new Benchmark.Suite;
suite
// kennebec
.add('0', function() {
return n % 1 == 0;
})
// kennebec
.add('1', function() {
return typeof n === 'number' && n % 1 == 0;
})
// kennebec
.add('2', function() {
return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
})
// Axle
.add('3', function() {
return n.toString().indexOf('.') === -1;
})
// Dagg Nabbit
.add('4', function() {
return n === +n && n === (n|0);
})
// warfares
.add('5', function() {
return parseInt(n) === n;
})
// Marcio Simao
.add('6', function() {
return /^-?[0-9]+$/.test(n.toString());
})
// Tal Liron
.add('7', function() {
if ((undefined === n) || (null === n)) {
return false;
}
if (typeof n == 'number') {
return true;
}
return !isNaN(n - 0);
});
// Define logs and Run
suite.on('cycle', function(event) {
console.log(String(event.target));
}).on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
}).run({ 'async': true });
0 x 12,832,357 ops/sec ±0.65% (90 runs sampled)
1 x 12,916,439 ops/sec ±0.62% (95 runs sampled)
2 x 2,776,583 ops/sec ±0.93% (92 runs sampled)
3 x 10,345,379 ops/sec ±0.49% (97 runs sampled)
4 x 53,766,106 ops/sec ±0.66% (93 runs sampled)
5 x 26,514,109 ops/sec ±2.72% (93 runs sampled)
6 x 10,146,270 ops/sec ±2.54% (90 runs sampled)
7 x 60,353,419 ops/sec ±0.35% (97 runs sampled)
Fastest is 7 Tal Liron
我喜欢这个小函数,它将对正整数和负整数都返回 true:
function isInt(val) {
return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0");
}
这是有效的,因为 1 或 "1" 变为 "1.0",isNaN() 返回 false (然后我们取反并返回),但 1.0 或 "1.0" 变为 "1.0.0",而 "string" 变为 "string. 0",两者都不是数字,因此 isNaN() 返回 false(并且再次被否定)。
如果你只想要正整数,有这个变体:
function isPositiveInt(val) {
return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val);
}
或者,对于负整数:
function isNegativeInt(val) {
return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val);
}
isPositiveInt() 通过将连接的数字字符串移动到要测试的值之前来工作。例如,isPositiveInt(1) 导致 isNaN() 评估“01”,其评估结果为 false。同时, isPositiveInt(-1) 导致 isNaN() 评估“0-1”,其评估结果为真。我们否定返回值,这给了我们想要的东西。 isNegativeInt() 的工作方式类似,但不会否定 isNaN() 的返回值。
编辑:
我最初的实现也会在数组和空字符串上返回 true。这个实现没有那个缺陷。如果 val 不是字符串或数字,或者如果它是空字符串,它还具有提前返回的好处,在这些情况下使其更快。您可以通过将前两个子句替换为
typeof(val) != "number"
如果您只想匹配文字数字(而不是字符串)
编辑:
我还不能发表评论,所以我将其添加到我的答案中。 @Asok 发布的基准非常有用;但是,最快的函数不符合要求,因为它也为浮点数、数组、布尔值和空字符串返回 TRUE。
我创建了以下测试套件来测试每个函数,并将我的答案添加到列表中(函数 8,它解析字符串,函数 9,它不):
funcs = [
function(n) {
return n % 1 == 0;
},
function(n) {
return typeof n === 'number' && n % 1 == 0;
},
function(n) {
return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
},
function(n) {
return n.toString().indexOf('.') === -1;
},
function(n) {
return n === +n && n === (n|0);
},
function(n) {
return parseInt(n) === n;
},
function(n) {
return /^-?[0-9]+$/.test(n.toString());
},
function(n) {
if ((undefined === n) || (null === n)) {
return false;
}
if (typeof n == 'number') {
return true;
}
return !isNaN(n - 0);
},
function(n) {
return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0");
}
];
vals = [
[1,true],
[-1,true],
[1.1,false],
[-1.1,false],
[[],false],
[{},false],
[true,false],
[false,false],
[null,false],
["",false],
["a",false],
["1",null],
["-1",null],
["1.1",null],
["-1.1",null]
];
for (var i in funcs) {
var pass = true;
console.log("Testing function "+i);
for (var ii in vals) {
var n = vals[ii][0];
var ns;
if (n === null) {
ns = n+"";
} else {
switch (typeof(n)) {
case "string":
ns = "'" + n + "'";
break;
case "object":
ns = Object.prototype.toString.call(n);
break;
default:
ns = n;
}
ns = "("+typeof(n)+") "+ns;
}
var x = vals[ii][1];
var xs;
if (x === null) {
xs = "(ANY)";
} else {
switch (typeof(x)) {
case "string":
xs = "'" + n + "'";
break;
case "object":
xs = Object.prototype.toString.call(x);
break;
default:
xs = x;
}
xs = "("+typeof(x)+") "+xs;
}
var rms;
try {
var r = funcs[i](n);
var rs;
if (r === null) {
rs = r+"";
} else {
switch (typeof(r)) {
case "string":
rs = "'" + r + "'";
break;
case "object":
rs = Object.prototype.toString.call(r);
break;
default:
rs = r;
}
rs = "("+typeof(r)+") "+rs;
}
var m;
var ms;
if (x === null) {
m = true;
ms = "N/A";
} else if (typeof(x) == 'object') {
m = (xs === rs);
ms = m;
} else {
m = (x === r);
ms = m;
}
if (!m) {
pass = false;
}
rms = "Result: "+rs+", Match: "+ms;
} catch (e) {
rms = "Test skipped; function threw exception!"
}
console.log(" Value: "+ns+", Expect: "+xs+", "+rms);
}
console.log(pass ? "PASS!" : "FAIL!");
}
我还重新运行了基准测试,函数 #8 添加到列表中。我不会发布结果,因为它们有点尴尬(例如,该功能不快)...
(删节——我删除了成功的测试,因为输出很长)结果如下:
Testing function 0
Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!
Testing function 1
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 2
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 3
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!
Testing function 4
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 5
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 6
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 7
Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
FAIL!
Testing function 8
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
Testing function 9
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!
我留下了失败,所以你可以看到每个函数失败的地方,并且(字符串)'#'测试,所以你可以看到每个函数如何处理字符串中的整数和浮点值,因为有些人可能希望将这些解析为数字和一些不得。
在测试的 10 个功能中,真正符合 OP 要求的功能是 [1,3,5,6,8,9]
function int(a) {
return a - a === 0 && a.toString(32).indexOf('.') === -1
}
function float(a) {
return a - a === 0 && a.toString(32).indexOf('.') !== -1
}
如果要排除字符串,可以添加 typeof a === 'number'
。
YourJS 提供以下两个适用于所有数字的函数,包括为 -Infinity
和 Infinity
返回 false
:
function isFloat(x) {
return typeOf(x, 'Number') && !!(x % 1);
}
function isInt(x) {
return typeOf(x, 'Number') && x % 1 == 0;
}
由于 typeOf()
是 YourJS 内部函数,如果您想使用这些定义,您可以在此处下载这些函数的版本:http://yourjs.com/snippets/build/34
true
、false
、null
、空数组、包含单个整数的数组、包含表示整数的字符串的数组,这也会返回 true整数,甚至更多。""
和1.0
isInt("");
&&isInt(1.0);
都导致true
看到这个演示jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
回答,是“只是错误”还是“SO 上的最差答案”,因为它不检查参数是否为数组第一的?是的,检查参数的好习惯,但这是开发人员的责任。所以答案应该简短,并尽可能清楚地直接回答问题。