检查JS对象types的最准确的方法是什么?

typeof运算符并不能真正帮助我们find对象的真实types。

我已经看到了下面的代码:

 Object.prototype.toString.apply(t) 

题:

它是检查对象types的准确的方法吗?

JavaScript规范给出了确定一个对象类的正确方法:

 Object.prototype.toString.call(t); 

http://bonsaiden.github.com/JavaScript-Garden/#types

Object.prototype.toString是一个好方法,但是它的性能是最差的。

http://jsperf.com/check-js-type

检查js类型的性能

使用typeof来解决一些基本问题(String,Number,Boolean …)并使用Object.prototype.toString来解决一些复杂的问题(如Array,Date,RegExp)。

这是我的解决scheme:

 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 

接受的答案是正确的,但我想在我构build的大多数项目中定义这个小工具。

 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); 

我把上面的正确答案的启发放在一个小的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