typeof
Оператор не помогает нам найти реальный тип объекта.
Я уже видел следующий код:
Object.prototype.toString.apply(t)
Вопрос:
Это самый точный способ проверки типа объекта?
javascript
Ройи Намир
источник
источник
Ответы:
Спецификация JavaScript дает ровно один правильный способ определения класса объекта:
http://bonsaiden.github.com/JavaScript-Garden/#types
источник
Object.prototype.toString.call(new FormData()) === "[object FormData]"
что было бы правдой. Вы также можете использовать,slice(8, -1)
чтобы вернутьсяFormData
вместо[object FormData]
Object.prototype
и{}
?Object.prototype.toString.call(new MyCustomObject())
возвращается,[object Object]
тогда какnew MyCustomObject() instanceOf MyCustomObject returns true
это то, что я хотел (Chrome 54.0.2840.99 м)new MyCustomObject().constructor === MyCustomObject
.Object.prototype.toString
это хороший способ, но его производительность является худшим.http://jsperf.com/check-js-type
Используйте
typeof
для решения какой-то основной проблемы (String, Number, Boolean ...) и используйтеObject.prototype.toString
для решения чего-то сложного (например, Array, Date, RegExp).и это мое решение:
использовать как:
источник
type
функция хороша, но посмотрите, как она работает по сравнению с некоторыми другимиtype
функциями. http://jsperf.com/code-type-test-a-test({}).toString.call(obj)
медленнее, чемObject.prototype.toString
jsperf.com/object-check-test77Принятый ответ правильный, но мне нравится определять эту маленькую утилиту в большинстве проектов, которые я создаю.
Используется так:
Если вы используете угловую, вы можете даже сделать точный впрыск:
источник
Держите ручку на прототипе, который вы ожидаете получить, затем сравните с ним.
например
источник
o instanceof String; //true
?"foo" instanceof String
ломаетсяtypeof(x)==='string'
вместо этого.Object.getPrototypeOf(true)
терпит неудачу, где(true).constructor
возвращаетсяBoolean
.Я бы сказал, что большинство решений, показанных здесь, страдают от чрезмерной инженерии. Вероятно, самый простой способ проверить, имеет ли значение тип,
[object Object]
это проверить его.constructor
свойство:или даже короче с функциями стрелок:
Эта
a != null
часть необходима, потому что можно передатьnull
или,undefined
и вы не можете извлечь свойство конструктора ни из одного из них.Работает с любым объектом, созданным с помощью:
Object
конструктор{}
Еще одна полезная особенность - это возможность предоставлять правильные отчеты для пользовательских классов, которые используют
Symbol.toStringTag
. Например:Проблема здесь в том, что при вызове
Object.prototype.toString
его экземпляра[object Object]
будет возвращен ложный отчет :Но проверка на конструкторе дает правильный результат:
источник
Лучший способ узнать тип объекта REAL (включая ОБА собственное имя объекта или типа данных (например, String, Date, Number, ..etc) И РЕАЛЬНЫЙ тип объекта (даже пользовательский); это захват свойство name конструктора прототипа объекта:
Родной Тип Ex1:
дисплеи:
Ex2:
дисплеи:
Пользовательские классы:
дисплеи:
источник
null
илиundefined
.Старый вопрос я знаю. Вам не нужно конвертировать это. Смотрите эту функцию:
Примеры:
Недорого и просто.
источник
false
если тестовый объект -null
илиundefined
true
илиfalse
false
. Как это поможет ответить на вопрос?Я собрал небольшую утилиту проверки типа, вдохновленную приведенными выше правильными ответами:
пример:
источник
null
илиundefined
илиtrue
илиfalse