1

事出有因

后端同事同一个接口传回的返回值类型不同,当结果是一个的时候是一个对象,多个的时候是一个数组,包含若干对象。虽然有点不合理,但是他说就这样,不能改。哎呦,我这暴脾气,算了自己搞。

所以对这个返回值的处理首先就是要判断其类型,进而使用 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"
    };

bhjzlwq
2 声望0 粉丝