Вот то, что я придумал:
function integer(x) {
if (typeof x !== "number" && typeof x !== "string" || x === "") {
return NaN;
} else {
x = Number(x);
return x === Math.floor(x) ? x : NaN;
}
}
(Примечание: я обновил эту функцию, чтобы защитить от пробелов. См. Ниже.)
Идея состоит в том, чтобыпринимать только аргументы, тип которых - Number или String (но не пустое строковое значение).Затем выполняется преобразование в Number (в случае, если это была строка), и, наконец, его значение сравнивается со значением floor (), чтобы определить, является ли число целым или нет.
integer(); // NaN
integer(""); // NaN
integer(null); // NaN
integer(true); // NaN
integer(false); // NaN
integer("1a"); // NaN
integer("1.3"); // NaN
integer(1.3); // NaN
integer(7); // 7
Однако значение NaN здесь «неправильно используется», поскольку числа с плавающей точкой и строки, представляющие числа с плавающей точкой, приводят к значению NaN, что технически неверно.
Кроме того, обратите внимание, что из-заесли строки преобразуются в числа, строковый аргумент может иметь конечный или начальный пробел или начальные нули:
integer(" 3 "); // 3
integer("0003"); // 3
Другой подход ...
Вы можете использовать регулярное выражение, если входное значение является строкой.Это регулярное выражение: /^\s*(\+|-)?\d+\s*$/
будет соответствовать строкам, представляющим целые числа.
ОБНОВЛЕННАЯ ФУНКЦИЯ!
function integer(x) {
if ( typeof x === "string" && /^\s*(\+|-)?\d+\s*$/.test(x) ) {
x = Number(x);
}
if ( typeof x === "number" ) {
return x === Math.floor(x) ? x : NaN;
}
return NaN;
}
Эта версия integer () является более строгой, поскольку она допускает только строки, которые следуют определенному шаблону (который проверяется с помощью регулярного выражения).Он выдает те же результаты, что и другая функция integer (), за исключением того, что он дополнительно игнорирует все строки пробелов (как указано @CMS).
Обновлено еще раз!
Я заметил ответ @ Zecc и немного упростил код ... Я думаю, это тоже работает:
function integer(x) {
if( /^\s*(\+|-)?\d+\s*$/.test(String(x)) ){
return parseInt(x, 10);
}
return Number.NaN;
}
Это, вероятно, не самое быстрое решение (с точки зрения производительности), но мне нравится его простота:)