Кто-нибудь знает, как я могу проверить, является ли переменная числом или строкой в JavaScript?
Кто-нибудь знает, как я могу проверить, является ли переменная числом или строкой в JavaScript?
Ответы:
Если вы имеете дело с буквенными обозначениями, а не с конструкторами, вы можете использовать typeof :.
typeof "Hello World"; // string
typeof 123; // number
Если вы создаете числа и строки с помощью конструктора, например var foo = new String("foo")
, вы должны иметь в виду , что typeof
может вернуться object
кfoo
.
Возможно, более надежным методом проверки типа было бы использование метода, найденного в underscore.js (аннотированный источник можно найти здесь ),
var toString = Object.prototype.toString;
_.isString = function (obj) {
return toString.call(obj) == '[object String]';
}
Это возвращает логическое значение true
для следующего:
_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true
var myString = new String("stuff I like"); isString(myString)
это возвращает false. Кроме того, я не совсем уверен, как долго длится преобразование backgroiund, я знаю, что когда я называю «hi» .length, «hi» преобразуется в объект, не уверен, как скоро он будет преобразован обратно или когда-либо будет связан к переменной.
Лучший способ сделать это - использовать isNaN
приведение типа +:
Обновлен метод олл-ин:
function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }
То же самое с использованием регулярных выражений:
function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); }
------------------------
isNumber('123'); // true
isNumber('123abc'); // false
isNumber(5); // true
isNumber('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber(' '); // false
null
приводится в 0 и возвращает истину дляisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
Лучший способ, который я нашел, - это либо проверить метод в строке, то есть:
if (x.substring) {
// do string thing
} else{
// do other thing
}
или если вы хотите что-то сделать с проверкой числа для свойства числа,
if (x.toFixed) {
// do number thing
} else {
// do other thing
}
Это что-то вроде «утки», это зависит от вас, какой способ имеет наибольшее значение. Мне не хватает кармы, чтобы комментировать, но typeof не работает для строк и чисел в штучной упаковке, то есть:
alert(typeof new String('Hello World'));
alert(typeof new Number(5));
предупредит "объект".
typeof
что он всегда может проверить строку, примитив или объект String. Вам просто нужно проверить метод, который уникален для нужного вам типа.
{substring:"hello"}
. Я знаю, что для своих целей я только что проверил, что конкретная операция, которую мне нужно было сделать (модуль), выполняет для типа, который мне нужно проверить (в строках модуль возвращает неопределенное значение), а затем проверил это вместо получения своего типа.
Вы ищете isNaN()
:
console.log(!isNaN(123));
console.log(!isNaN(-1.23));
console.log(!isNaN(5-2));
console.log(!isNaN(0));
console.log(!isNaN("0"));
console.log(!isNaN("2"));
console.log(!isNaN("Hello"));
console.log(!isNaN("2005/12/12"));
См. JavaScript isNaN () Функция в MDN.
isNaN
возвращается false
за null
(но true
за undefined
).
Проверьте, является ли значение строковым литералом или объектом String:
function isString(o) {
return typeof o == "string" || (typeof o == "object" && o.constructor === String);
}
Модульный тест:
function assertTrue(value, message) {
if (!value) {
alert("Assertion error: " + message);
}
}
function assertFalse(value, message)
{
assertTrue(!value, message);
}
assertTrue(isString("string literal"), "number literal");
assertTrue(isString(new String("String object")), "String object");
assertFalse(isString(1), "number literal");
assertFalse(isString(true), "boolean literal");
assertFalse(isString({}), "object");
Проверка на номер похожа:
function isNumber(o) {
return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}
function is (type, value) { return value["constructor"] === type; }
?
Начиная с ES2015, правильный способ проверить, содержит ли переменная правильное число, Number.isFinite(value)
Примеры:
Number.isFinite(Infinity) // false
Number.isFinite(NaN) // false
Number.isFinite(-Infinity) // false
Number.isFinite(0) // true
Number.isFinite(2e64) // true
Number.isFinite('0') // false
Number.isFinite(null) // false
Попробуй это,
<script>
var regInteger = /^-?\d+$/;
function isInteger( str ) {
return regInteger.test( str );
}
if(isInteger("1a11")) {
console.log( 'Integer' );
} else {
console.log( 'Non Integer' );
}
</script>
Лучший способ сделать это:
function isNumber(num) {
return (typeof num == 'string' || typeof num == 'number') && !isNaN(num - 0) && num !== '';
};
Это удовлетворяет следующим тестам:
assertEquals("ISNUMBER-True: 0", true, isNumber(0));
assertEquals("ISNUMBER-True: 1", true, isNumber(-1));
assertEquals("ISNUMBER-True: 2", true, isNumber(-500));
assertEquals("ISNUMBER-True: 3", true, isNumber(15000));
assertEquals("ISNUMBER-True: 4", true, isNumber(0.35));
assertEquals("ISNUMBER-True: 5", true, isNumber(-10.35));
assertEquals("ISNUMBER-True: 6", true, isNumber(2.534e25));
assertEquals("ISNUMBER-True: 7", true, isNumber('2.534e25'));
assertEquals("ISNUMBER-True: 8", true, isNumber('52334'));
assertEquals("ISNUMBER-True: 9", true, isNumber('-234'));
assertEquals("ISNUMBER-False: 0", false, isNumber(NaN));
assertEquals("ISNUMBER-False: 1", false, isNumber({}));
assertEquals("ISNUMBER-False: 2", false, isNumber([]));
assertEquals("ISNUMBER-False: 3", false, isNumber(''));
assertEquals("ISNUMBER-False: 4", false, isNumber('one'));
assertEquals("ISNUMBER-False: 5", false, isNumber(true));
assertEquals("ISNUMBER-False: 6", false, isNumber(false));
assertEquals("ISNUMBER-False: 7", false, isNumber());
assertEquals("ISNUMBER-False: 8", false, isNumber(undefined));
assertEquals("ISNUMBER-False: 9", false, isNumber(null));
//testing data types accurately in JavaScript (opposed to "typeof")
//from http://bonsaiden.github.com/JavaScript-Garden/
function is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
//basic usage
is('String', 'test'); // true
is('Array', true); // false
Или адаптируйте его так, чтобы он возвращал неизвестный тип:
function realTypeOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
//usage
realTypeOf(999); // 'Number'
12 мая 2012 Обновление: Полный пример на Javascript: Лучший тип .
realTypeOf
: realTypeOf(NaN) -> "Number"
что такое же поведение , как typeof
согласился , но все еще далеко от идеала.
Вот подход, основанный на идее приведения ввода к числу или строке путем добавления нуля или пустой строки, а затем проведите типизированное сравнение на равенство.
function is_number(x) { return x === x+0; }
function is_string(x) { return x === x+""; }
По какой-то непостижимой причине, x===x+0
кажется, работает лучше, чемx===+x
.
Есть ли случаи, когда это не удается?
В том же духе:
function is_boolean(x) { return x === !!x; }
Это выглядит немного быстрее, чем либо, x===true || x===false
либо typeof x==="boolean"
(и гораздо быстрее, чемx===Boolean(x)
).
Тогда есть также
function is_regexp(x) { return x === RegExp(x); }
Все это зависит от существования операции «идентификация», специфичной для каждого типа, которая может применяться к любому значению и надежно генерировать значение рассматриваемого типа. Я не могу думать о такой операции для дат.
Для NaN есть
function is_nan(x) { return x !== x;}
Это в основном версия подчеркивания, и в нынешнем виде она примерно в четыре раза быстрее isNaN()
, но комментарии в источнике подчеркивания упоминают, что «NaN - это единственное число, которое не равно себе», и добавляет проверку для _.isNumber. Почему? Какие другие объекты не будут равны себе? Кроме того, подчеркивание использует - x !== +x
но какая разница может+
изменить здесь?
Тогда для параноика:
function is_undefined(x) { return x===[][0]; }
или это
function is_undefined(x) { return x===void(0); }
Вы можете просто разделить его на 1?
Я предполагаю, что проблема заключалась бы в строковом вводе типа: «123ABG»
var Check = "123ABG"
if(Check == Check / 1)
{
alert("This IS a number \n")
}
else
{
alert("This is NOT a number \n")
}
Просто так, как я это сделал недавно.
ну как насчет просто:
function IsString(obj) {
return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}
После дальнейшего рассмотрения спустя много месяцев, это только гарантирует obj
, что объект, для которого toLowerCase
определено имя метода или свойства . Мне стыдно за мой ответ. Пожалуйста, смотрите один из лучших typeof
.
Или просто используйте инверсию isNaN()
:
if(!isNaN(data))
do something with the number
else
it is a string
И да, использование jQuery $.isNumeric()
более приятное занятие.
isNaN('123')
дает false, хотя аргумент является числовой строкой, а не числовым типом
Я думаю, что преобразование var в строку снижает производительность, по крайней мере, этот тест, выполненный в последних браузерах, показывает это.
Так что если вы заботитесь о производительности, я бы использовал это:
typeof str === "string" || str instanceof String
для проверки, является ли переменная строкой (даже если вы используете var str = new String("foo")
, str instanceof String
вернет true).
Что касается проверки, если это число, я бы пошел на родной isNaN
:; функция.
JQuery использует это:
function isNumber(obj) {
return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}
Это решение решает многие проблемы, поднятые здесь!
Это, безусловно, самый надежный метод, который я когда-либо использовал. Я не изобрел это, и не могу вспомнить, где я первоначально нашел это. Но это работает там, где другие методы не работают:
// Begin public utility /getVarType/
// Returns 'Function', 'Object', 'Array',
// 'String', 'Number', 'Boolean', or 'Undefined'
getVarType = function ( data ){
if (undefined === data ){ return 'Undefined'; }
if (data === null ){ return 'Null'; }
return {}.toString.call(data).slice(8, -1);
};
// End public utility /getVarType/
Пример правильности
var str = new String();
console.warn( getVarType(str) ); // Reports "String"
console.warn( typeof str ); // Reports "object"
var num = new Number();
console.warn( getVarType(num) ); // Reports "Number"
console.warn( typeof num ); // Reports "object"
var list = [];
console.warn( getVarType( list ) ); // Reports "Array"
console.warn( typeof list ); // Reports "object"
typeof
метода (0,788 с против 1,481 с) в Chrome. Это, безусловно, приемлемая производительность, учитывая улучшенные результаты. Почему вы думаете, что это "очень медленно?" Может быть, это - в IE6 / 7/8? Но все "очень медленно" в этих браузерах.
typeof
будет в 100 раз быстрее, чего мне не хватает?
Если вы используете JQuery,
$.isNumeric()
справиться с этим. Более подробная информация на http://api.jquery.com/jQuery.isNumeric/
Typeof работает очень хорошо для меня в большинстве случаев. Вы можете попробовать использовать оператор if
if(typeof x === 'string' || typeof x === 'number') {
console.log("Your statement");
}
где x - любое имя переменной по вашему выбору
лучший способ, который я нашел, который также думает о положительных и отрицательных числах, от: O'Reilly Javascript и DHTML Cookbook :
function isNumber(elem) {
var str = elem.value;
var oneDecimal = false;
var oneChar = 0;
// make sure value hasn't cast to a number data type
str = str.toString( );
for (var i = 0; i < str.length; i++) {
oneChar = str.charAt(i).charCodeAt(0);
// OK for minus sign as first character
if (oneChar = = 45) {
if (i = = 0) {
continue;
} else {
alert("Only the first character may be a minus sign.");
return false;
}
}
// OK for one decimal point
if (oneChar = = 46) {
if (!oneDecimal) {
oneDecimal = true;
continue;
} else {
alert("Only one decimal is allowed in a number.");
return false;
}
}
// characters outside of 0 through 9 not OK
if (oneChar < 48 || oneChar > 57) {
alert("Enter only numbers into the field.");
return false;
}
}
return true;
}
Errr? Просто используйте регулярные выражения! :)
function isInteger(val) {
return val.match(/^[0-9]$/)
}
function isFloat(val) {
return val.match(/^[0-9]*/\.[0-9]+$/)
}
поскольку строка типа '1234' с typeof будет показывать 'string', а обратное никогда не произойдет (typeof 123 всегда будет числом), лучше всего использовать простое регулярное выражение /^\-?\d+$/.test(var)
. Или более продвинутый, чтобы соответствовать числам с плавающей запятой, целым числам и отрицательным числам /^[\-\+]?[\d]+\.?(\d+)?$/
. Важной стороной .test
является то, что он не выдаст исключение, если переменная не является строкой, значение может быть любым.
var val, regex = /^[\-\+]?[\d]+\.?(\d+)?$/;
regex.test(val) // false
val = '1234';
regex.test(val) // true
val = '-213';
regex.test(val) // true
val = '-213.2312';
regex.test(val) // true
val = '+213.2312';
regex.test(val) // true
val = 123;
regex.test(val) // true
val = new Number(123);
regex.test(val) // true
val = new String('123');
regex.test(val) // true
val = '1234e';
regex.test(val) // false
val = {};
regex.test(val) // false
val = false;
regex.test(val) // false
regex.test(undefined) // false
regex.test(null) // false
regex.test(window) // false
regex.test(document) // false
Если вы ищете реальный тип, тогда подойдет только typeof.
Вы можете проверить тип переменной с помощью typeof
оператора:
typeof variable
Код ниже возвращает true для чисел и false для всего остального:
!isNaN(+variable);
typeof
оператор! @JustAMartin
number
но если я передам «123» или «abc» или любой другой заключенный в кавычки литерал, это будет строка, и не имеет значения, может ли она быть разбита на число или нет.
Операция XOR может использоваться для определения числа или строки. число ^ 0 всегда будет давать число в качестве вывода, а строка ^ 0 будет давать 0 в качестве вывода.
Example:
1) 2 ^ 0 = 2
2) '2' ^ 0 = 2
3) 'Str' ^ 0 = 0
Просто и тщательно:
function isNumber(x) {
return parseFloat(x) == x
};
Тестовые случаи:
console.log('***TRUE CASES***');
console.log(isNumber(0));
console.log(isNumber(-1));
console.log(isNumber(-500));
console.log(isNumber(15000));
console.log(isNumber(0.35));
console.log(isNumber(-10.35));
console.log(isNumber(2.534e25));
console.log(isNumber('2.534e25'));
console.log(isNumber('52334'));
console.log(isNumber('-234'));
console.log(isNumber(Infinity));
console.log(isNumber(-Infinity));
console.log(isNumber('Infinity'));
console.log(isNumber('-Infinity'));
console.log('***FALSE CASES***');
console.log(isNumber(NaN));
console.log(isNumber({}));
console.log(isNumber([]));
console.log(isNumber(''));
console.log(isNumber('one'));
console.log(isNumber(true));
console.log(isNumber(false));
console.log(isNumber());
console.log(isNumber(undefined));
console.log(isNumber(null));
console.log(isNumber('-234aa'));
Очень поздно на вечеринку; Тем не менее, следующее всегда работало хорошо для меня, когда я хочу проверить, является ли какой-либо ввод либо строкой, либо числом в одном кадре.
return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);
Создал jsperf для проверки, является ли переменная числом. Довольно интересно! У typeof действительно есть использование производительности. Использование typeof
для чего-либо, кроме чисел, как правило, идет 1/3 скорости какvariable.constructor
поскольку большинство типов данных в javascript - это Objects; номера нет!
http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
| самый быстрый | если вы хотите число, например, 5, а не «5»
typeof parseFloat(variable) === 'number'
| самый быстрый | если вы хотите число, например, 5 и 5
isNaN()
медленнее, но не намного медленнее. Я возлагал большие надежды parseInt
и parseFloat
, однако, они были ужасно медленными.
Для определения чисел важен следующий отрывок из JavaScript: «Хорошие части» Дугласа Крокфорда:
Функция isFinite - лучший способ определить, можно ли использовать значение в качестве числа, поскольку оно отклоняет NaN и Infinity. К сожалению, isFinite попытается преобразовать свой операнд в число, так что это не очень хороший тест, если значение на самом деле не является числом. Вы можете определить свою собственную функцию isNumber:
var isNumber = function isNumber(value) { return typeof value === 'number' &&
isFinite(value);
};