Skip to content

Latest commit

 

History

History
109 lines (91 loc) · 3.1 KB

类型判断.md

File metadata and controls

109 lines (91 loc) · 3.1 KB

类型判断

  1. null:null
  2. undefined:undefined
  3. 基本类型:typeof
  4. function:typeof
  5. 复杂类型:Object.prototype.toString.call()

Javascript数据类型判断

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判断

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)
}

EmptyObject

是否空对象

function isEmptyObject( obj ) {
  for ( var name in obj ) return false
  return true;
}

Window对象

是否window

function isWindow( obj ) {
  return obj != null && obj === obj.window;
}

isArrayLike

  1. 必须含有length属性
  2. 如果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
}

isElement

是否 DOM 元素

isElement = function(obj) {
  return !!(obj && obj.nodeType === 1);
};

参考

JavaScript专题之类型判断(上) JavaScript专题之类型判断(下)