美文网首页
【js基础】isPlainObject实现与分析

【js基础】isPlainObject实现与分析

作者: SophieRabbit | 来源:发表于2020-01-09 15:24 被阅读0次

以下代码可以判断object的类型。

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';

};

ECMAScript中的对象其实就是一组数据和功能的集合。通过new操作符后跟要创建的对象类型的名称来创建。这里的Object相当于祖宗一样,创建Object的实例并没有什么用处。他像是java中java.lang.Object 对象一样。

// 创建一个Object对象

var o = new Object();

由于这样的方式创建的object,无法使用上面的代码判断其object的具体类型(无内容的object类型),我们称这样的object对象为“不纯粹”。

通过new关键字创建的的对象不纯粹。

Object.create(null)不纯粹。

通过以下代码,可以判断是否是“纯粹”的object。

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。

原文链接:https://blog.csdn.net/qq_34893429/article/details/72886678

相关文章

网友评论

      本文标题:【js基础】isPlainObject实现与分析

      本文链接:https://www.haomeiwen.com/subject/afttactx.html