Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как опознать число? (https://javascript.ru/forum/misc/4226-kak-opoznat-chislo.html)

Octane 03.07.2009 18:36

:blink: не знал, что:
alert(null * 1) // будет 0

Ушел читать спецификацию…

ZoNT 03.07.2009 18:37

[example run]function isNumber1(x) {
return x < 0 || x > 0 || x === 0;
}
alert(isNumber1('1'))[/example]

Riim 03.07.2009 18:51

Все варианты трудно учесть, да и смысла не вижу. Например, если функция должна принимать число и получает NaN, то это ошибка и притом вполне возможная, если же она получает, например массив, то это уже неадекватная ошибка. Я пишу код под себя и сам я так точно не ошибусь.
Для чисел я обрабатываю такие варианты: положительные/отрицательные числа, 0, null, undefined, NaN
Для не чисел: null, undefined и если нет, то даже typeof/instanceof часто можно не смотреть (тут в каждой ситуации нужно отдельно думать)
Этого вполне хватает что бы учесть все !адекватные! ошибки.
Предложенный мною вариант все, что мне нужно учитывает, и более быстрого я не вижу.

Zeroglif 03.07.2009 19:10

typeof x == 'number' && isFinite(x);

Octane 03.07.2009 19:20

Наверное, самый железный вариант:
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)]);

x-yuri 04.07.2009 01:12

а
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.