- null:null
- undefined:undefined
- 基本类型:typeof
- function:typeof
- 复杂类型:Object.prototype.toString.call()
function type(obj) {
// null || undefined
if (obj == null) return obj + ''
var type = typeof obj
if (type !== "object") return type
if (type === "function") return typeof obj === "function"
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}
plainObject:该对象是通过 "{}" 或 "new Object" 创建的,该对象含有零个或者多个键值对
function Person(name) {
this.name = name;
}
console.log($.isPlainObject({})) // true
console.log($.isPlainObject(new Object)) // true
console.log($.isPlainObject(Object.create(null))); // true
console.log($.isPlainObject(Object.assign({a: 1}, {b: 2}))); // true
console.log($.isPlainObject(new Person('yayu'))); // false
console.log($.isPlainObject(Object.create({}))); // false
// 相当于 Object.prototype.hasOwnProperty
var hasOwn = Object.prototype.hasOwnProperty
function isPlainObject(obj) {
// 排除掉明显不是obj的以及一些宿主对象如Window
if (!obj || toString.call(obj) !== "[object Object]") return false
/**
* getPrototypeOf es5 方法,获取 obj 的原型
* 以 new Object 创建的对象为例的话
* obj.__proto__ === Object.prototype
*/
var proto = Object.getPrototypeOf(obj)
// 没有原型的对象是纯粹的,Object.create(null) 就在这里返回 true
if (!proto) return true
/**
* 以下判断通过 new Object 方式创建的对象
* 判断 proto 是否有 constructor 属性,如果有就让 Ctor 的值为 proto.constructor
* 如果是 Object 函数创建的对象,Ctor 在这里就等于 Object 构造函数
*/
Ctor = hasOwn.call(proto, "constructor") && proto.constructor
// 在这里判断 Ctor 构造函数是不是 Object 构造函数,用于区分自定义构造函数和 Object 构造函数
return typeof Ctor === "function" && hasOwn.toString.call(Ctor) === hasOwn.toString.call(Object)
}
是否空对象
function isEmptyObject( obj ) {
for ( var name in obj ) return false
return true;
}
是否window
function isWindow( obj ) {
return obj != null && obj === obj.window;
}
- 必须含有length属性
- 如果length大于0,则obj[length - 1]必须存在
function isArrayLike(obj) {
// obj 必须有 length属性
var length = !!obj && "length" in obj && obj.length;
// 排除掉函数和 Window 对象
if (typeof obj === "function" || obj === obj.window) return false
return type === "array" || length === 0 || typeof length === "number" && length > 0 && (length - 1) in obj
}
是否 DOM 元素
isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};