在javascript里需要判断一个变量到底是不是一个对象,这在变量处理特别是数据遍历的时候经常遇到。那么有什么方法可以判断是不是一个对象呢?
1. typeof 关键字(不推荐)
const a = undefined;
const b = 'abc';
const c = 1;
const d = [1,2];
const e = {a: 1};
const f = null;
const g = function() {
console.log('function');
}
console.log(typeof a, typeof b, typeof c, typeof d, typeof e, typeof f, typeof g);
// output: undefined string number object object object function
当变量是 null, 数组或者普通对象的时候,typeof 返回的都是 object 字符串。
所以我们可以这样判断:
if (obj !== null && typeof obj === 'object') {
// It is an object
}
2. instanceof 关键字
可以用 instanceof 检测构造函数的prototype
属性是否存在于Object对象的原型链上:
const a = undefined;
const b = 'abc';
const c = 1;
const d = [1,2];
const e = { a: 1 };
const f = null;
const g = function() {
console.log('function');
}
console.log( a instanceof Object, b instanceof Object, c instanceof Object, d instanceof Object, e instanceof Object, f instanceof Object, g instanceof Object,)
// output: false false false true true false true
可以发现数组,普通对象和函数对象执行 instanceof Object 都返回true。
需要注意的是,不会将 null 视为对象。但会把函数看成对象。
3. Array.isArray 方法
当判断变量是不是数组对象的时候,这个方法很好用。
const a = undefined;
const b = 'abc';
const c = 1;
const d = [1,2];
const e = { a: 1 };
const f = null;
const g = function() {
console.log('function');
}
console.log( Array.isArray(a), Array.isArray(b), Array.isArray(c), Array.isArray(d), Array.isArray(e), Array.isArray(f), Array.isArray(g),)
// output: false false false true false false false
只有数组对象才返回true。
可以这样使用:
if (typeof arr === 'object' && Array.isArray(arr)) {
// It is an array object
}
4. Object.propotype.toString 方法
const a = undefined;
const b = 'abc';
const c = 1;
const d = [1,2];
const e = { a: 1 };
const f = null;
const g = function() {
console.log('function');
}
console.log( Object.prototype.toString.call(a), Object.prototype.toString.call(b), Object.prototype.toString.call(c), Object.prototype.toString.call(d), Object.prototype.toString.call(e), Object.prototype.toString.call(f), Object.prototype.toString.call(g),)
// output:[object Undefined] [object String] [object Number] [object Array] [object Object] [object Null] [object Function]
当且仅当变量是普通对象的时候,返回的是[object Object].
可以这样判断:
if (Object.propotype.toString.call(obj) === '[object Object]') {
// It is a regular object
}
5. 使用 lodash 库提供的方法
如果你的项目有引用lodash库的话,可以使用它提供的一些方法进行判断。
_.isObject(): 检查一个值是否是对象(包括数组、函数、对象、正则表达式等).
_.isPlainObject(): 检查一个值是否是一个普通对象.
_.isObjectLike(): 检查一个值是否是类对象,即它不是 null
且 typeof
后的结果是 "object"。
_.isFunction(): 检查一个值是否是函数.
总结
根据使用的实际情况,可以用不同的方式去判断。通常情况下,使用Object.prototype.toString 方法可以准确地判断一个变量的类型。