Самое простое и чистое решение до ECMAScript-6 (которое также достаточно надежно, чтобы возвращать 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
parseInt.