Оператор typeof не помогает нам найти реальный тип объекта.
Я уже видел следующий код:
Object.prototype.toString.apply(t)  
Вопрос:
Является ли это наиболее точным способом проверки типа объекта?
Оператор typeof не помогает нам найти реальный тип объекта.
Я уже видел следующий код:
Object.prototype.toString.apply(t)  
Вопрос:
Является ли это наиболее точным способом проверки типа объекта?
Спецификация JavaScript дает ровно один правильный способ определения класса объекта:
Object.prototype.toString.call(t);
		 Object.prototype.toString - хороший способ, но его производительность хуже всего.
http://jsperf.com/check-js-type
 
Используйте typeof для решения основной проблемы (String, Number, Boolean...) и используйте Object.prototype.toString для решения чего-то сложного (например, Array, Date, RegExp).
и это мое решение:
var type = (function(global) {
    var cache = {};
    return function(obj) {
        var key;
        return obj === null ? 'null' // null
            : obj === global ? 'global' // window in browser or global in nodejs
            : (key = typeof obj) !== 'object' ? key // basic: string, boolean, number, undefined, function
            : obj.nodeType ? 'object' // DOM element
            : cache[key = ({}).toString.call(obj)] // cached. date, regexp, error, object, array, math
            || (cache[key] = key.slice(8, -1).toLowerCase()); // get XXXX from [object XXXX], and cache it
    };
}(this));
использовать как:
type(function(){}); // -> "function"
type([1, 2, 3]); // -> "array"
type(new Date()); // -> "date"
type({}); // -> "object"
		var o = ...
var proto =  Object.getPrototypeOf(o);
proto === SomeThing;
Сохраните дескриптор прототипа, который вы ожидаете от объекта, и сравните его.
например
var o = "someString";
var proto =  Object.getPrototypeOf(o);
proto === String.prototype; // true
		Принятый ответ правильный, но мне нравится определять эту небольшую утилиту в большинстве проектов, которые я строю.
var types = {
   'get': function(prop) {
      return Object.prototype.toString.call(prop);
   },
   'object': '[object Object]',
   'array': '[object Array]',
   'string': '[object String]',
   'boolean': '[object Boolean]',
   'number': '[object Number]'
}
Используется следующим образом:
if(types.get(prop) == types.number) {
}
Если вы используете angular, вы можете даже просто его ввести:
angular.constant('types', types);
		Я собрал небольшую утилиту проверки типа, основанной на правильных ответах:
thetypeof = function(name) {
        let obj = {};
        obj.object = 'object Object'
        obj.array = 'object Array'
        obj.string = 'object String'
        obj.boolean = 'object Boolean'
        obj.number = 'object Number'
        obj.type = Object.prototype.toString.call(name).slice(1, -1)
        obj.name = Object.prototype.toString.call(name).slice(8, -1)
        obj.is = (ofType) => {
            ofType = ofType.toLowerCase();
            return (obj.type === obj[ofType])? true: false
        }
        obj.isnt = (ofType) => {
            ofType = ofType.toLowerCase();
            return (obj.type !== obj[ofType])? true: false
        }
        obj.error = (ofType) => {
            throw new TypeError(`The type of ${name} is ${obj.name}: `
            +`it should be of type ${ofType}`)
        }
        return obj;
    };
Пример:
if (thetypeof(prop).isnt('String')) thetypeof(prop).error('String')
if (thetypeof(prop).is('Number')) // do something