判断是否为对象或数组的方法
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 typeOf与instanceof
typeOf和instanceof并不能完全判断一个值为对象- typeOf: 是一个一元运算符,放在一个运算符之前,运算符可以是任意类型
undefined: 未定义boolean: 布尔值string: 字符串number: 数值object: 对象(包括数组)和nullfunction: 函数symbol: Symbol
instanceof操作符对于数组和对象都返回trueinstanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上[] instanceof Object; // truenew 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()用于测试一个对象是否存在另一个对象的原型链上,不能用来判断对象