:blink: не знал, что:
alert(null * 1) // будет 0 Ушел читать спецификацию… |
[example run]function isNumber1(x) {
return x < 0 || x > 0 || x === 0; } alert(isNumber1('1'))[/example] |
Все варианты трудно учесть, да и смысла не вижу. Например, если функция должна принимать число и получает NaN, то это ошибка и притом вполне возможная, если же она получает, например массив, то это уже неадекватная ошибка. Я пишу код под себя и сам я так точно не ошибусь.
Для чисел я обрабатываю такие варианты: положительные/отрицательные числа, 0, null, undefined, NaN Для не чисел: null, undefined и если нет, то даже typeof/instanceof часто можно не смотреть (тут в каждой ситуации нужно отдельно думать) Этого вполне хватает что бы учесть все !адекватные! ошибки. Предложенный мною вариант все, что мне нужно учитывает, и более быстрого я не вижу. |
typeof x == 'number' && isFinite(x);
|
Наверное, самый железный вариант:
var a = NaN; var b = 1; var c = {}; var d = Infinity; var e = null; function isNumber(x) { return Object.prototype.toString.call(x) == "[object Number]" && isFinite(x); } alert([isNumber(a), isNumber(b), isNumber(c), isNumber(d), isNumber(e)]); |
а
var a = NaN; var b = 1; var c = {}; var d = Infinity; var e = null; function isNumber(x) { return (typeof x == "number" || x instanceof Number) && isFinite(x); } alert([isNumber(a), isNumber(b), isNumber(c), isNumber(d), isNumber(e)]); UPD: уже вижу недостатки, хоть они и не всегда актуальны |
Часовой пояс GMT +3, время: 16:14. |