Есть ли лучший способ получить тип переменной в JS, чем typeof
? Он отлично работает, когда вы делаете:
> typeof 1
"number"
> typeof "hello"
"string"
Но это бесполезно, когда вы пытаетесь:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Я знаю instanceof
, но это требует, чтобы вы знали тип заранее.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Есть ли способ лучше?
javascript
types
typeof
Aillyn
источник
источник
typeof new RegExp(/./); // "function"
проблема в Chrome, по-видимому, исправлена в Chrome 14.n
вместо ожидаемого исходного имени. Например,constructor.name
может дать вамn
вместо ожидаемого полного имениОтветы:
Ангус Кролл недавно написал интересную запись в блоге об этом -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Он рассматривает все «за» и «против» различных методов, а затем определяет новый метод «toType» -
источник
ActiveXObject
Экземпляры Internet Explorer , например.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Вместо этого рассмотрим более общий,match(/\s([^\]]+)/)
который должен обрабатывать что угодно.\w
вместо этого использовать слово оператор ...Вы можете попробовать использовать
constructor.name
.Как и во всем JavaScript, кто-то в конце концов неизменно укажет, что это как-то зло, так что здесь есть ссылка на ответ, который довольно хорошо это освещает.
Альтернативой является использование
Object.prototype.toString.call
источник
name
является расширением ECMAScript и не будет работать во всех браузерах.constructor.name
скорее всего, в конечном итоге вы получите что-то похожееn
на ожидаемое вами имя объекта. Так что следите за этим - особенно если вы только минимизируете производство.null
и,undefined
к сожалению, нет конструктора.Достаточно хорошая функция захвата типов - та, что используется YUI3 :
Это захватывает многие из примитивов, предоставленных javascript, но вы всегда можете добавить больше, изменив
TYPES
объект. Обратите внимание, чтоtypeof HTMLElementCollection
в Safari сообщитfunction
, но тип (HTMLElementCollection) вернетobject
источник
Вам может пригодиться следующая функция:
Или в ES7 (прокомментируйте, если дальнейшие улучшения)
Полученные результаты:
Спасибо @johnrees за сообщение об ошибке, обещании, функции генератора
источник
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Также мы можем немного изменить пример с ipr101
и позвонить как
источник
однострочная функция:
это дает тот же результат, что и
jQuery.type()
источник
Вы можете подать заявку
Object.prototype.toString
на любой объект:Это хорошо работает во всех браузерах, за исключением IE - при вызове этого для переменной, полученной из другого окна, он просто выплевывает
[object Object]
.источник
Мои 2 ¢! На самом деле, одна из причин, по которой я привожу это здесь, несмотря на длинный список ответов, заключается в том, чтобы предоставить немного больше
all in one
типовых решений и получить обратную связь в будущем о том, как расширить его, чтобы включить большеreal types
.С помощью следующего решения, как было упомянуто выше, я объединил пару найденных здесь решений, а также включил исправление для возврата значения в jQueryопределенный объект jQuery, если он доступен . Я также добавляю метод к собственному прототипу Object. Я знаю, что это часто табу, так как это может помешать другим подобным расширениям, но я оставляю это
user beware
. Если вам не нравится этот способ, просто скопируйте базовую функцию куда угодно и замените все переменныеthis
на параметр аргумента для передачи (например, arguments [0]).Тогда просто используйте с легкостью, вот так:
Больше примеров:
Если у вас есть что добавить, что может быть полезным, например, определение того, когда объект был создан с другой библиотекой (Moo, Proto, Yui, Dojo и т. Д.), Пожалуйста, не стесняйтесь комментировать или редактировать это, и пусть оно будет более точный и точный. ИЛИ перевернись к тому, что GitHubя сделал для этого, и дай мне знать. Там вы также найдете быструю ссылку на файл cdn min.
источник
В моих предварительных тестах это работает довольно хорошо. В первом случае будет напечатано имя любого объекта, созданного с помощью «new», а во втором случае должно быть зафиксировано все остальное.
Я использую,
(8, -1)
потому что я предполагаю, что результат всегда будет начинаться с[object
и заканчиваться,]
но я не уверен, что это верно в каждом сценарии.источник
Думаю, самое универсальное решение здесь - это сначала проверить,
undefined
аnull
потом просто позвонитьconstructor.name.toLowerCase()
.источник
.constructor.name
всегда содержит строковое значение. Для undefined / null у нас есть соответствующие строки, возвращаемые функцией.constructor
это унаследованное свойство, оно разбивается на объекты, созданные с помощьюObject.create(null)
. Достаточно просто исправить, но как это назвать? "[объект нуль]"?typeof
условие используется для проверки типа переменной, если вы проверяете тип переменной в условии if-else, напримеристочник