function isNumeric(n) {
return !isNaN( parseFloat(n) && isFinite(n) );
}
// - isFinite(n) - аргумент к числу и возвращает TRUE (если это не NaN/Infinity/-Infinity). Правая часть отсеивает заведомо не-числа, но оставить значение true/false/null/'', так как они корректно преобразуются в числа 1/0/0/0
// - parseFloat(n) - левая часть для значение - true/false/null/'' вернет NaN, таким образом мы их отсеем. Алгоритм работы parseFloat - преобразует аргумент к строке('true'), а затем считывает из него число, при этом пустая строка дает NaN
// - в результате отсеивается всё, кроме строк-чисел и обычных чисел
function getType(elem) {
return {}.toString.call(elem).slice(8, -1);
}