Кто-нибудь знает, как я могу проверить, является ли переменная числом или строкой в JavaScript?
javascript
types
Джин Юн
источник
источник
Ответы:
Если вы имеете дело с буквенными обозначениями, а не с конструкторами, вы можете использовать typeof :.
Если вы создаете числа и строки с помощью конструктора, например
var foo = new String("foo")
, вы должны иметь в виду , чтоtypeof
может вернутьсяobject
кfoo
.Возможно, более надежным методом проверки типа было бы использование метода, найденного в underscore.js (аннотированный источник можно найти здесь ),
Это возвращает логическое значение
true
для следующего:источник
var myString = new String("stuff I like"); isString(myString)
это возвращает false. Кроме того, я не совсем уверен, как долго длится преобразование backgroiund, я знаю, что когда я называю «hi» .length, «hi» преобразуется в объект, не уверен, как скоро он будет преобразован обратно или когда-либо будет связан к переменной.Лучший способ сделать это - использовать
isNaN
приведение типа +:Обновлен метод олл-ин:
То же самое с использованием регулярных выражений:
источник
null
приводится в 0 и возвращает истину дляisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
Лучший способ, который я нашел, - это либо проверить метод в строке, то есть:
или если вы хотите что-то сделать с проверкой числа для свойства числа,
Это что-то вроде «утки», это зависит от вас, какой способ имеет наибольшее значение. Мне не хватает кармы, чтобы комментировать, но typeof не работает для строк и чисел в штучной упаковке, то есть:
предупредит "объект".
источник
typeof
что он всегда может проверить строку, примитив или объект String. Вам просто нужно проверить метод, который уникален для нужного вам типа.{substring:"hello"}
. Я знаю, что для своих целей я только что проверил, что конкретная операция, которую мне нужно было сделать (модуль), выполняет для типа, который мне нужно проверить (в строках модуль возвращает неопределенное значение), а затем проверил это вместо получения своего типа.Вы ищете
isNaN()
:См. JavaScript isNaN () Функция в MDN.
источник
isNaN
возвращаетсяfalse
заnull
(ноtrue
заundefined
).Проверьте, является ли значение строковым литералом или объектом String:
Модульный тест:
Проверка на номер похожа:
источник
function is (type, value) { return value["constructor"] === type; }
?Начиная с ES2015, правильный способ проверить, содержит ли переменная правильное число,
Number.isFinite(value)
Примеры:
источник
Попробуй это,
источник
Лучший способ сделать это:
Это удовлетворяет следующим тестам:
источник
Или адаптируйте его так, чтобы он возвращал неизвестный тип:
12 мая 2012 Обновление: Полный пример на Javascript: Лучший тип .
источник
realTypeOf
:realTypeOf(NaN) -> "Number"
что такое же поведение , какtypeof
согласился , но все еще далеко от идеала.Вот подход, основанный на идее приведения ввода к числу или строке путем добавления нуля или пустой строки, а затем проведите типизированное сравнение на равенство.
По какой-то непостижимой причине,
x===x+0
кажется, работает лучше, чемx===+x
.Есть ли случаи, когда это не удается?
В том же духе:
Это выглядит немного быстрее, чем либо,
x===true || x===false
либоtypeof x==="boolean"
(и гораздо быстрее, чемx===Boolean(x)
).Тогда есть также
Все это зависит от существования операции «идентификация», специфичной для каждого типа, которая может применяться к любому значению и надежно генерировать значение рассматриваемого типа. Я не могу думать о такой операции для дат.
Для NaN есть
Это в основном версия подчеркивания, и в нынешнем виде она примерно в четыре раза быстрее
isNaN()
, но комментарии в источнике подчеркивания упоминают, что «NaN - это единственное число, которое не равно себе», и добавляет проверку для _.isNumber. Почему? Какие другие объекты не будут равны себе? Кроме того, подчеркивание использует -x !== +x
но какая разница может+
изменить здесь?Тогда для параноика:
или это
источник
Вы можете просто разделить его на 1?
Я предполагаю, что проблема заключалась бы в строковом вводе типа: «123ABG»
Просто так, как я это сделал недавно.
источник
ну как насчет просто:
После дальнейшего рассмотрения спустя много месяцев, это только гарантирует
obj
, что объект, для которогоtoLowerCase
определено имя метода или свойства . Мне стыдно за мой ответ. Пожалуйста, смотрите один из лучшихtypeof
.источник
Или просто используйте инверсию
isNaN()
:И да, использование jQuery
$.isNumeric()
более приятное занятие.источник
isNaN('123')
дает false, хотя аргумент является числовой строкой, а не числовым типомЯ думаю, что преобразование var в строку снижает производительность, по крайней мере, этот тест, выполненный в последних браузерах, показывает это.
Так что если вы заботитесь о производительности, я бы использовал это:
для проверки, является ли переменная строкой (даже если вы используете
var str = new String("foo")
,str instanceof String
вернет true).Что касается проверки, если это число, я бы пошел на родной
isNaN
:; функция.источник
JQuery использует это:
источник
Это решение решает многие проблемы, поднятые здесь!
Это, безусловно, самый надежный метод, который я когда-либо использовал. Я не изобрел это, и не могу вспомнить, где я первоначально нашел это. Но это работает там, где другие методы не работают:
Пример правильности
источник
typeof
метода (0,788 с против 1,481 с) в Chrome. Это, безусловно, приемлемая производительность, учитывая улучшенные результаты. Почему вы думаете, что это "очень медленно?" Может быть, это - в IE6 / 7/8? Но все "очень медленно" в этих браузерах.typeof
будет в 100 раз быстрее, чего мне не хватает?Если вы используете JQuery,
справиться с этим. Более подробная информация на http://api.jquery.com/jQuery.isNumeric/
источник
Typeof работает очень хорошо для меня в большинстве случаев. Вы можете попробовать использовать оператор if
где x - любое имя переменной по вашему выбору
источник
лучший способ, который я нашел, который также думает о положительных и отрицательных числах, от: O'Reilly Javascript и DHTML Cookbook :
}
источник
Errr? Просто используйте регулярные выражения! :)
источник
поскольку строка типа '1234' с typeof будет показывать 'string', а обратное никогда не произойдет (typeof 123 всегда будет числом), лучше всего использовать простое регулярное выражение
/^\-?\d+$/.test(var)
. Или более продвинутый, чтобы соответствовать числам с плавающей запятой, целым числам и отрицательным числам/^[\-\+]?[\d]+\.?(\d+)?$/
. Важной стороной.test
является то, что он не выдаст исключение, если переменная не является строкой, значение может быть любым.Если вы ищете реальный тип, тогда подойдет только typeof.
источник
Ответ @ BitOfUniverse хорош, и я придумываю новый способ:
Я знаю, что
0
не может быть дивидендов, но здесь функция работает отлично.источник
Проверка типа
Вы можете проверить тип переменной с помощью
typeof
оператора:Проверка значения
Код ниже возвращает true для чисел и false для всего остального:
источник
typeof
оператор! @JustAMartinnumber
но если я передам «123» или «abc» или любой другой заключенный в кавычки литерал, это будет строка, и не имеет значения, может ли она быть разбита на число или нет.Операция XOR может использоваться для определения числа или строки. число ^ 0 всегда будет давать число в качестве вывода, а строка ^ 0 будет давать 0 в качестве вывода.
источник
Просто и тщательно:
Тестовые случаи:
источник
Просто используйте
или
если вы хотите обрабатывать строки, определенные как объекты или литералы и сохраняемые, вы не хотите использовать вспомогательную функцию.
источник
источник
Очень поздно на вечеринку; Тем не менее, следующее всегда работало хорошо для меня, когда я хочу проверить, является ли какой-либо ввод либо строкой, либо числом в одном кадре.
источник
Создал 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 и 5isNaN()
медленнее, но не намного медленнее. Я возлагал большие надеждыparseInt
иparseFloat
, однако, они были ужасно медленными.источник
Для определения чисел важен следующий отрывок из JavaScript: «Хорошие части» Дугласа Крокфорда:
источник