JS 判断是否为对象或数组的几种方法

4,339 阅读2分钟

判断是否为对象或数组的方法

1. 判断值是否为对象

1.1 toString方式

Object.prototype.toString.call(val) === '[Object Object]'; // true为对象

1.2 constructor方式

val.constructor === Object; // true 为对象

1.3 Object.getPrototypeOf方式,用来读取对象的prototype对象

Object.getPrototypeOf(val) === Object.prototype; // true为对象

1.4 _proto_方式(不推荐)

  • _proto_属性,用来读取或设置当前对象的prototype对象,此属性未纳入标准,不建议使用
  • val._proto_ === Object.prototype; // true为对象

1.5 typeOfinstanceof

  • typeOfinstanceof并不能完全判断一个值为对象
  • typeOf: 是一个一元运算符,放在一个运算符之前,运算符可以是任意类型
    • undefined: 未定义
    • boolean: 布尔值
    • string: 字符串
    • number: 数值
    • object: 对象(包括数组)和null
    • function: 函数
    • symbol: Symbol
  • instanceof操作符对于数组和对象都返回true
    • instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
    • [] instanceof Object; // true
    • new Object instanceof Object; // true

2. 对象是否为空

2.1 将json对象转化为json字符串,再判断改字符串是否为{}

  • JSON.stringif(data) === '{}'

2.2 使用Object.getOwnPropertyNames()方法+length属性进行判断

  • Object.getOwnPropertyNames(obj).length

2.3 使用es6的方法Object.keys()+length属性进行判断

  • Object.keys(obj).length

2.4 for in循环判断,配合Object.getOwnPropertyNames()或Object.hasOwnProperty()来进行过滤

function isObjectEmpty (obj) {
  for (let key in obj) {
    if(obj.hasOwnProperty(key)) return false
  }
  return true
}

3. 判断是否为数组

3.1 toString方式

  • Object.prototype.toString.call(val) === '[Object Array]' // true为数组
  • 注意: 这里要用Object的toString方法,Array的toString返回的是拼接的字符串 var arr = ['a', 'b', 'c']; val.toString(); // a,b,c

3.2 Array.isArray推荐,ES5中提供的来判断是否为数组

  • Array.isArray(val); // true 为数组

3.3 instanceof方式

  • val instanceof Array; // true为数组
  • instanceof可以用来判断数组而不可以判断对象,因为数组本身就是一个类似于列表的高阶对象
  • 所有对象都是Object对象的后代,所以任何对象和object用instanceof都会但会true

3.4 constructor 方式

  • val.constructor === Array; // true 为数组

3.5 _proto_方式(不推荐)

  • val._proto_ === Array.prototype; // true 为数组

3.6 Object.getPrototypeOf

  • Object.getPrototypeOf(val) === Array.prototype; // true为数组

3.7 isPrototypeOf

  • Array.prototype.isPrototypeOf(val); // true为数组
  • isPrototypeOf()用于测试一个对象是否存在另一个对象的原型链上,不能用来判断对象