Вы можете использовать typeof
оператор:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Пример с этой веб-страницы . (Пример был немного изменен, хотя).
Это не будет работать, как ожидается, в случае строк, созданных с помощью new String()
, но это редко используется и рекомендуется против [1] [2] . Посмотрите другие ответы о том, как справиться с этим, если вы этого хотите.
- В Руководстве по стилю Google JavaScript говорится, что никогда не используйте примитивные обертки объектов .
- Дуглас Крокфорд рекомендовал, чтобы примитивные объектные обертки были устаревшими .
Пабло Санта Круз
источник
new String('foo')
, но это не имеет значения, потому что строки, обернутые в объект, являются бесполезной функцией, которую вы не должны использовать. Руководство по стилю Google запрещает их , Дуглас Крокфорд хочет, чтобы они устарели , а библиотеки их не используют. Притворяться, что они не существуют, и использоватьtypeof
без страха.typeof
было признано устаревшим ?Это то, что работает для меня:
источник
instanceof
проверка здесь - бессмысленный шум, если вы не следуете некоторым очень необычным методам кодирования, и этот ответ не объясняет, что он делает или почему вы можете его использовать. Единственная причина, по которой вам когда-либо это понадобится, это если вы используете строки, обернутые объектами, но строки, обернутые объектами, - бесполезная функция, которую никто не использует, и Google и Крокфорд оба осуждают как плохую практику ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).typeof
иinstanceof
чувствует , как хороший совет , если ваш код может быть вызван другими. Крайнийpostmessage
случай @ MarkAmery имеет значение, если вы спрашиваете: «Что я только что сделалpostmessage
?» - но вы ожидаете, что это будет обработано на интерфейсе и не разрешено распространяться. В других местах кажется правильным работать с не осуждаемыми методами кодирования, даже если некоторые эстетики JS их не одобряют. НИКОГДА не комментируйте ваш код как принимающий String, если это не так!Поскольку более 580 человек проголосовали за неправильный ответ, а 800+ проголосовали за рабочий, но в стиле дробовика, я подумал, что, возможно, стоит повторить мой ответ в более простой форме, понятной каждому.
Или встроенный (у меня есть настройка UltiSnip для этого):
К вашему сведению, ответ Пабло Санта-Круса неверен, потому что
typeof new String("string")
этоobject
Ответ DRAX точный и функциональный, и должен быть правильным (поскольку Пабло Санта-Крус, безусловно, неверен, и я не буду спорить с голосами избирателей).
Тем не менее, этот ответ также определенно правильный и фактически лучший ответ (за исключением, возможно, предложения использовать lodash / underscore ). Отказ от ответственности: я внес вклад в кодовую базу lodash 4.
Мой оригинальный ответ (который явно пролетел над многими головами) следующий:
Я перекодировал это из underscore.js:
Это определит isString, isNumber и т. Д.
В Node.js это может быть реализовано как модуль:
[edit]:
Object.prototype.toString.call(x)
работает для разграничения функций и асинхронных функций:источник
global || window
вместо него,window
но это будет плохой подход для решения проблемы, которую вы не должны иметь в первую очередь).myObject+"" === myObject
чтобы проверить, является ли объект строкой (или, что еще лучше, я бы не стал проверять тип в первую очередь в управляемой поведением системе типов).toString
вObject.prototype
. Итак, я бы сказал, что полагаться наtoString
проверку типа объекта - это, в лучшем случае, плохая практика.Я рекомендую использовать встроенные функции из jQuery или lodash / Underscore . Они проще в использовании и легче для чтения.
Любая функция будет обрабатывать случай, упомянутый DRAX ... то есть они оба проверяют, является ли (A) переменная строковым литералом или (B) это экземпляр объекта String. В любом случае эти функции правильно идентифицируют значение как строку.
lodash / Underscore.js
JQuery
Видеть документацию lodash для _.isString () для более подробной информации.
См. Документацию jQuery для $ .type () для более подробной информации.
источник
_.every()
поначалу это немного сбивает с толку, и что-то столь же простое, как_.isBoolean()
запутало разработчиков в моей компании. Разработчик ошибочно полагал, что будет ложным, если значение будет логическим и будет ложным. Английский для меня легче читать, чем немецкий, потому что я не знаю немецкий. Изучайте JavaScript, и все это будет иметь смысл.Я видел это здесь:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
источник
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
имеет лучшую читаемость, чемx === y
?Лучший способ:
Каждый из них был создан соответствующей функцией класса, такой как «new Object ()» и т. Д.
Кроме того, Duck-Typing: «Если он выглядит как утка, ходит как утка и пахнет как утка - это должен быть массив». Проверьте значения.
Надеюсь это поможет.
Редактировать; 12/05/2016
Помните, что вы всегда можете использовать комбинации подходов. Вот пример использования встроенной карты действий с typeof :
Вот более реальный пример использования встроенных карт:
Эта функция будет использовать [custom] «приведение типов», а точнее «type - / - value-mapping», чтобы выяснить, существует ли переменная на самом деле. Теперь вы можете разделить эти неприятные волосы между
null
&0
!Много раз вы даже не заботитесь о его типе . Еще один способ обойти типизацию - это комбинирование наборов Duck-Type:
Оба
Number.prototype
иString.prototype
есть.toString() method
. Вы просто удостоверились, что строковый эквивалент числа был тем же самым, и затем вы убедились, что передали его вhttp
функцию какNumber
. Другими словами, мы даже не заботились какой у него был тип.Надеюсь, это даст вам больше возможностей для работы :)
источник
(o.constructor === Number || s.constructor === Boolean)
). Анекдотично,parseInt
иNaN
хрупкие, но мощные инструменты. Просто помните, что Not-a-Number - это НЕ Not-a-Number, и можно определить undefined.if(thing.call) { 'its a function'; }
илиif(thing.defineProperties) { 'its an object'; }
. Спасибо за вклад, axkibe!Я не могу честно понять, почему нельзя просто использовать
typeof
в этом случае:Да, он потерпит неудачу в отношении строк, обернутых объектами (например
new String('foo')
), но они широко расцениваются как плохая практика, и большинство современных инструментов разработки, вероятно, будут препятствовать их использованию. (Если вы видите один, просто исправьте это!)Object.prototype.toString
Хитрость заключается в то , что все интерфейсные разработчики были признаны виновными делать один день в своей карьере , но не позволяйте ему обмануть вас своей полировки умный: он сломается , как только что - то обезьяна-патч прототипа объекта:источник
Мне нравится использовать это простое решение:
источник
undefined
иnull
, и все же получение правильного ответа для пустых строк (как''
иnew String('')
).(mystring || false) && mystring.constructor === String
. Я использовал false в случае, если он используется в функции, которая должна возвращать логическое значение.Это отличный пример того, почему производительность имеет значение:
Выполнение чего-либо столь же простого, как тест на строку, может быть дорогостоящим, если не выполнено правильно.
Например, если бы я хотел написать функцию для проверки, является ли что-то строкой, я мог бы сделать это одним из двух способов:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Оба они довольно просты, так что может повлиять на производительность? Вообще говоря, вызовы функций могут быть дорогими, особенно если вы не знаете, что происходит внутри. В первом примере есть вызов функции для метода toString объекта. Во втором примере нет вызовов функций, так как typeof и instanceof являются операторами. Операторы значительно быстрее, чем вызовы функций.
Когда тестируется производительность, пример 1 на 79% медленнее, чем пример 2!
Смотрите тесты: https://jsperf.com/isstringtype
источник
typeof str === 'string' || str instanceof String
(могу опустить скобки, которые я предпочитаю вif (..)
случаях); независимо от того, проверка как примитивных, так и объектных типов в # 2 ясна и достаточна. Эти проверки должны быть «редкими» в любом случае.Работает как для строковых литералов, так
let s = 'blah'
и для объектных строкlet s = new String('blah')
источник
Взято из Лодаш:
источник
Я думаю, что решения @customcommander должно хватить в 90% случаев:
Должен служить вам правильно (просто так как обычно нет причин иметь
new String('something')
в вашем коде ).Если вы заинтересованы в обработке
String
объекта (например, вы ожидаете некоторого var от стороннего производителя), то использование lodash, как предложено @ ClearCloud8, кажется ясным, простым и элегантным решением.Однако я бы посоветовал быть осторожным с такими библиотеками, как lodash, из-за их размера. Вместо того чтобы делать
Который приносит весь огромный объект lodash, я бы предложил что-то вроде:
И с простой связкой у вас все должно быть в порядке (я ссылаюсь здесь на код клиента).
источник
Я также обнаружил, что это тоже хорошо работает и намного короче, чем другие примеры.
Конкатенация в пустых кавычках превращает значение в строку. Если
myVar
это уже строка, то оператор if успешен.источник
typeof
.typeof
но все же немного быстрее, чемtoString
. В любом случае, я думаю, мне просто нравится синтаксис для принуждения.var s = new String('abc'); > s === s + '' > false
new String
cus, который создает типobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2Если вы работаете в среде node.js, вы можете просто использовать встроенную функцию isString в утилитах.
Редактировать: как уже упоминалось @Jehy, это устарело начиная с v4.
источник
typeof value === 'string'
вместо».x = new String('x'); x.isString(x);
возвращает ложь . Существует,util.types.isStringObject()
но это возвращает ложь дляx = 'x'
типа строки. Две служебные функции, которые не предоставляют никакой полезности ...Следующий метод проверяет, является ли какая-либо переменная строкой ( включая переменные, которые не существуют ).
источник
источник
false
.Я считаю эту простую технику полезной для проверки типов для String -
Та же техника работает и для номера -
А для RegExp -
То же самое для объекта -
NB, регулярные выражения, массивы и функции тоже считаются объектами.
Но проверка на Array немного отличается -
Этот метод не работает для функций, однако -
источник
var x = new String(x); String(x)===x
возвращает ложь однако({}).toString.call(x).search(/String/)>0
всегда возвращается для тяжелых вещейfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
илиisClass(3,/Number/)
илиisClass(null,/Null/)
Простое решение будет:
источник
toString()
функцию.toString
любые значения; попробуйте, если проверяемый x равен нулю или не определен, исключениеtoString()
метод может быть переопределен и может вызвать исключение (из-за некоторой конкретной реализации), и ваша проверка не будет работать наверняка. Основная идея заключается в том, что вы не должны вызывать методы, которые не связаны с тем, что вы хотите получить. Я даже не говорю о ненужных накладных расходах, связанных сtoString
методом. Downvoting.Помощник Typechecker:
Применение:
Также, если вы хотите, чтобы он был рекурсивным (например, Array, который является объектом), вы можете использовать
instanceof
.(
['cs'] instanceof Object //true
)источник
Здесь я собираюсь пойти другим путем, чтобы попытаться определить, является ли переменная определенным типом или членом определенного набора типов.
JS построен на Ducktyping; если что-то крякает как строка, мы можем и должны использовать это как строку.
Это
7
строка? Тогда почему/\d/.test(7)
работает?Это
{toString:()=>('hello there')}
строка? Тогда почему({toString:()=>('hello there')}) + '\ngeneral kenobi!'
работает?Это не вопросы о SHOULD ли работать выше, дело в том, что они делают.
Итак, я сделал
duckyString()
функцию.Ниже я проверяю много случаев, не удовлетворяемых другими ответами. Для каждого кода:
duckyString()
нормализацию входных данных для кода, который ожидает реальные строкиЭто в том же духе,
!!x
чтоx===true
и тестирование, если что-то похоже на массив, а не требует фактического массива.объекты jQuery; они массивы? Нет, они достаточно хороши? Да, вы можете просто запустить их через
Array.prototype
функции.Именно эта гибкость дает JS свою силу, и тестирование на строки делает ваш код менее совместимым.
Результат вышеупомянутого:
Итак, все дело в том, почему вы хотите знать, является ли что-то строкой.
Если, как и я, вы пришли сюда из Google и хотели узнать, не было ли что -то похожее на строку , вот ответ.
Это даже не дорого, если вы не работаете с действительно длинными или глубоко вложенными массивами символов.
Это потому, что это все операторы if, а не вызовы функций вроде
.toString()
.За исключением случаев, когда вы пытаетесь увидеть, является ли массив символов с объектами, которые имеют только
toString()
многобайтовые или только символы, в этом случае нет другого способа проверить, кроме как создать строку и подсчитать количество символов, которые составляют байты, соответственноВключены варианты для
.toString()
)Вот еще тесты, потому что я завершитель:
Вывод:
источник
Просто чтобы расширить ответ @ DRAX , я бы сделал это:
Он также будет учитывать
null
s иundefined
типы, и будет заботиться о нестроковых типах, таких как0
.источник
Это достаточно хорошо для меня.
ВНИМАНИЕ: Это не идеальное решение. Смотрите внизу моего поста.
И вы можете использовать это, как показано ниже.
ВНИМАНИЕ: Это работает неправильно в случае:
источник
Вы можете использовать эту функцию, чтобы определить тип чего-либо:
Чтобы проверить, является ли переменная строкой:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
источник
Я не уверен, что вы имеете в виду, зная, является ли он типом
string
независимо от его содержимого, или является ли он числом или строкой, независимо от его типа.Итак, чтобы узнать, является ли его тип строкой, на это уже дан ответ.
Но чтобы узнать на основе его содержимого, является ли оно строкой или числом, я бы использовал это:
И для некоторых примеров:
источник
/^\d+$/.test('123')
чтобы избежать сложностей потенциальных проблем с синтаксическим