检查JS对象types的最准确的方法是什么?
typeof
运算符并不能真正帮助我们find对象的真实types。
我已经看到了下面的代码:
Object.prototype.toString.apply(t)
题:
它是检查对象types的最准确的方法吗?
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)。
这是我的解决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