JS如何判断输入的数据是否为对象

在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(): 检查一个值是否是类对象,即它不是 nulltypeof 后的结果是 "object"。

_.isFunction(): 检查一个值是否是函数.

总结

根据使用的实际情况,可以用不同的方式去判断。通常情况下,使用Object.prototype.toString 方法可以准确地判断一个变量的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夕阳_醉了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值