2014-10-23 6 views
3

Я читать онлайн учебник говорится: На самом деле, самый надежный контроль преобразования либо регулярное выражение или IsNumeric ниже:Проверить числовое значение в JavaScript

function isNumeric(n) { 
    return !isNaN(parseFloat(n)) && isFinite(n) 
} 

Мой вопрос, почему эта функция не может быть упрощена:

function isNumeric(n) { 
     return isFinite(n) 
    } 
+0

Это не требуется, потому что если n не определено, это приведет к ошибке ссылки – gardni

+0

Так что это можно упростить правильно? Я нахожу, что учебное пособие находится на http://javascript.info/tutorial/number-math – bean

+0

@ Нико ах Я неправильно понял проблему (просто подумал проверить ввод как номер). –

ответ

2

Мой вопрос почему эта функция не может быть упрощена:

function isNumeric(n) { 
    return isFinite(n) 
} 

Он не может, нет, вы хотите, чтобы parseFloat там, если есть какой-то шанс n не может быть числом, чтобы начать с. Но это может быть упрощена:

function isNumeric(n) { 
    return isFinite(parseFloat(n)); 
} 

... потому что isFinite(NaN) ложна, что и ваша функция возвращается для чисел в любом случае не поддается синтаксическому анализу.

Стоит отметить, что parseFloat остановится на первом недопустимого символа и вернуть то, что число он нашел до этого момента, так parseFloat("123abc") является 123, не NaN. Если вы хотите проверить, что вся строка может быть разобран правильно с плавающей точкой, используйте + или Number():

function isNumeric(n) { 
    return isFinite(+n); // Or: return isFinite(Number(n)); 
} 

Теперь, если вы знаете наверняка, что n будет всегда уже быть числом (не булево или строка или что-то еще), то да, вы могли бы пропустить этап синтаксического анализа.

2

Поскольку isFinite (п) возвращает истину для не-числовых значений, например:

alert(isFinite(false)); // displays true 
+0

'NaN' - это нечисловое значение, но' isFinite (NaN) 'возвращает false. –

+1

Возможно, просто здесь отсутствует слово «для ** некоторых ** нечисловых значений» (так как только один юридический ввод должен привести к неправильному результату, чтобы аннулировать подход). – Niko

0

Ну нет, вы не можете использовать конечно, поскольку это вернет true только для конечного числа.

Например, isFinite(1/0) возвращает false.

Бесконечность - это число, которое просто не является конечным.

Я предлагаю смотреть на то, как крупные библиотеки сделать это, например:

Jquery

isNumeric: function(obj) { 
// parseFloat NaNs numeric-cast false positives (null|true|false|"") 
// ...but misinterprets leading-number strings, particularly hex literals ("0x...") 
// subtraction forces infinities to NaN 
    return obj - parseFloat(obj) >= 0; 
} 

Underscore.js

function isNumber(obj) { 
    return toString.call(obj) == '[object Number]'; 
} 
Смежные вопросы