以下代码可以判断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
网友评论