Я понимаю, что на это уже много раз отвечали, но вот достойный кандидат, который может быть полезен в некоторых сценариях.
следует отметить, что предполагается, что «.42» - это НЕ число, а «4.» НЕ является числом, поэтому это следует учитывать.
function isDecimal(x) {
return '' + x === '' + +x;
}
function isInteger(x) {
return '' + x === '' + parseInt(x);
}
isDecimal
проходит следующий тест:
function testIsNumber(f) {
return f('-1') && f('-1.5') && f('0') && f('0.42')
&& !f('.42') && !f('99,999') && !f('0x89f')
&& !f('#abcdef') && !f('1.2.3') && !f('') && !f('blah');
}
Идея в том, что каждое число или целое число имеет одно «каноническое» строковое представление, и каждое неканоническое представление должно быть отклонено. Таким образом, мы приводим число и обратно и видим, является ли результат исходной строкой.
Полезность этих функций для вас зависит от варианта использования. Одна особенность состоит в том, что различные строки представляют различные числа (если оба проходят тест isNumber()
).
Это актуально, например, для чисел в качестве имен свойств объекта.
var obj = {};
obj['4'] = 'canonical 4';
obj['04'] = 'alias of 4';
obj[4]; // prints 'canonical 4' to the console.