资讯专栏INFORMATION COLUMN

数组和对象 从 typeof 到 instanceof 再到一劳永逸

Bryan / 3080人阅读

摘要:事出有因后端同事同一个接口传回的返回值类型不同,当结果是一个的时候是一个对象,多个的时候是一个数组,包含若干对象。由果而发会返回一个变量的基本类型,只有以下几种例为啥数组和对象都返回在中,除了,,,,其它的实例都会归为。

事出有因

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89944.html

相关文章

  • 对象、原型与原型链

    摘要:的过程创建一个空对象,让指向它,通过,等赋值,最终返回。原型和实例在上面代码中,是原型,是它的实例。实例的对应原型的即所有对象都是的实例,并继承的属性和方法。这个串起来的链就是原型链。 Object.defineProperty let obj = { key0: 0 } Object.defineProperty(obj, key1, { value: 1, ...

    浠ラ箍 评论0 收藏0
  • 面试题目别有洞天 -> es6优雅解法,降级polyfill,再redux reduce

    摘要:每次被执行时,和被传入,这个根据进行累加或者是自身消减,英文原意,进而返回最新的。 之前的一篇文章:从一道面试题,到我可能看了假源码讨论了bind方法的各种进阶Pollyfill,今天再分享一个有意思的题目。 从解这道题目出发,我会谈到数组的Reduce方法,ES6特性和Redux数据流框架中Reducer的命名等等。一道典型的题目,却如唐代诗人章碣《对月》诗中所云:别有洞天三十六,水...

    econi 评论0 收藏0
  • javaScript常用的方法

    摘要:判断一个对象是否为空对象不为,仅仅是可以使用如下方法判断也可以数组去重或者也可以对字符串去重多个数组一起去重判断数据类型结果为这个方法基本可以一劳永逸的解决所带来的不确定性 判断一个对象是否为空对象,不为null,仅仅是{};可以使用如下方法判断: if (JSON.stringify(object) === {}) { //.. } //也可以 if (Object.keys...

    hedge_hog 评论0 收藏0
  • JavaScript系列--类型判断的4种基本方法,研究jquery的type方法,空对象的检测方法

    摘要:用对象字面量创建的对象会报错,使用构造函数创建的对象属于。发现,构造函数创建的,,,,。从原型链角度讲,构造函数就是新对象的的类型。 一、前言 类型判断有时候真的头疼,但是一旦熟练使用就会觉得不过如此。初级的,会判断数字和字符串。中级的,会判断数组和对象。进阶的,会判断日期,正则,错误类型。高级的,会判断plainObject,空对象,window对象等等。 基本类型:String、N...

    lavor 评论0 收藏0

发表评论

0条评论

Bryan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<