事出有因
后端同事同一个接口传回的返回值类型不同,当结果是一个的时候是一个对象,多个的时候是一个数组,包含若干对象。虽然有点不合理,但是他说就这样,不能改。哎呦,我这暴脾气,算了自己搞。
所以对这个返回值的处理首先就是要判断其类型,进而使用 instanceof ,但是这个方法的调用有点记不清了,是 arr instanceof Array 还是 Array instanceof arr 呢?
由因及果
有这样的疑惑是因为typeof,typeof(value)经常用来获取(不是判断)变量的类型 ,可惜不能用来判断数组和对象,因为返回的都是 object 。
“instanceof a”字面意思是 “a的实例”,那么“ b instanceof a ”的意思就可以理解为“b是a的实例吗?”所以返回一个布尔值true或者false也就合情合理了。
由果而发
typeof会返回一个变量的基本类型,只有以下几种:number,boolean,string,object,undefined,function;例:
console.log(typeof(1));//number
console.log(typeof("abc"));//string
console.log(typeof(true));//boolean
console.log(typeof(a));//undefined
console.log(typeof({}));//object
console.log(typeof([]));//object
var fun = function(){}
console.log(typeof(fun))//function
为啥数组和对象都返回object? 在ECMA中,除了Number,String,undefined,Boolean,其它的实例都会归为object。或者说,typeof 就设计到这一步了
instanceof 可以用来判断是否对象、数组、函数,其他的也不行。而且它判断数组也不是万能的,判断iframe中的数组时就没有效果,因为执行环境不同,不共用同一套原型链。那用什么方法呢?
可以使用Object.prototype.toString.call(object)直接返回加头的组合类型。
所以也可以写一个函数处理一下直接返回变量类型(不过不能判断‘undefined‘,为啥typeof可以?因为typeof是一元操作符,不是函数,不信试试console.log(typeof(typeof))。同理,instanceof是二元操作符):
var typeOf = function(param){
var TYPE = Object.prototype.toString.call(param).split(" ")[1];
return TYPE.substr(0,TYPE.length-1);
}
也可以参考jQuery的处理方式:
var class2type = {};
$.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
$.type = function (obj) {
return obj == null ?
String(obj) : class2type[ toString.call(obj) ] || "object"
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。