isPlainObject实现与分析

首先我们需要一个判断类型的神码。

var toString = [].toString,
            hasOwn = Object.prototype.hasOwnProperty;
        var types = {
            '[object Boolean]':'bool',
            '[object Number]' : 'number',  
            '[object String]' : 'string',  
            '[object Object]':'object',
            '[object Array]':'array',
            '[object Function]':'function',
            '[object Date]' : 'date',  
            '[object RegExp]' : 'regExp',  
        };
        var type = function(obj){
            return obj === null ? String(obj) : types[toString.call(obj)] || 'object'; 
        };
        var isWindow = function(obj){
            return obj && typeof obj === 'object' && 'setInterval' in obj;
        };
        var isArray = Array.isArray || function(obj){
            return type(obj) === 'array';
        };

神在哪里,神在他让js有了确定的类型。。。
什么是纯粹的object?
我也不好说。
什么不纯粹呢?
通过构造函数new的对象不纯粹。
Object.create(null)不纯粹。

 if(obj.constructor && !hasOwn.call(obj, 'constructor') 
                    && !hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')){
                    return false;
                }

如果是Object.create(null)构造的对象,是没有constructor指针的
这里写图片描述
这也是(obj.construcor &&)的判断结果。
其次用构造函数new的对象,constructor存在于obj原型链中,而isPrototypeOf在constructor的原型链上,而不在constructor原型上!

 var isPlainObject = function(obj){
            if(!obj || type(obj) !== 'object' || isWindow(obj) || obj.nodeType){
                return false;
            }
            try{
                if(obj.constructor && !hasOwn.call(obj, 'constructor') 
                    && !hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')){
                    return false;
                }
            }catch(e){
                return false
            }
            var key;
            for(key in obj){}
            return key === undefined || hasOwn.call(obj, key)
        }

try-catch主要是为了兼容IE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值