在 javascript 中如何正确的判断一个数据是否为 纯对象 类型

引言

很多小伙伴可能对于object类型的判断会写出错误的逻辑,可能写错了自己还不知道,那是因为你对javascript的数据类型和相关语法可能不是很熟,还有就是javascriptobject类型包含很多种数据类型,下面由我来帮助你们解答这些疑问。

object包含的类型

下面使用你们常用的判断方法来演示,typeofinstanceof

const obj={}
const arr=[]
const date=new Date()
const reg=/ /
const str=new String()
const fun=function(){}

console.log(obj instanceof Object)   //true
console.log(arr instanceof Object)   //true
console.log(date instanceof Object)   //true
console.log(reg instanceof Object)   //true
console.log(str instanceof Object)    //true
console.log(fun instanceof Object)    //true

console.log(typeof obj)   //object
console.log(typeof arr)   //object
console.log(typeof date)  //object
console.log(typeof reg)   //object
console.log(typeof str)   //object
console.log(typeof fun)   //function

由此可见,使用typeofinstanceof检查引用(object)类型时,除了函数特殊之外,其他都为object类型。

你真的了解instanceof 吗

instanceof从字面上很容易让人误解它的意思,a instanceof b字面上理解就是 a是由b创建的实例,在一定程度上可以这么理解,但是并非如此。instanceof的真正含义是:在原型链中,a的父辈或者祖辈是 b.prototype,也就是b.prototypea的原型链上端,对原型链还不够了解的小伙伴,可以看看我发的关于原型链的一篇文章 -->原型链详解

如何判断一个数据是否为纯对象类型

什么是纯对象类型,这里其实是我自己起的一个名字,就是值为 {}之类的数据。看过上面的例子后,你会发现使用typeofinstanceof来判断,在某些场景是会出错的,显然不够严谨。下面看一个例子你就会明白如何正确的来判断一个数据是否为纯对象

function _typeOf(v){                            
  return Object.prototype.toString.call(v).split(' ')[1].split(']')[0]
}

const obj={}
const str='abc'
const nul=null
const obj1={a:1}
const arr=[]
const date=new Date()
const reg=/a/
const func=function(){}

console.log(_typeOf(obj))   // Object
console.log(_typeOf(str))   // String
console.log(_typeOf(nul))   // Null
console.log(_typeOf(obj1))  // Object
console.log(_typeOf(arr))   // Array
console.log(_typeOf(date))  // Date
console.log(_typeOf(reg))   // RegExp
console.log(_typeOf(func))  // Function

观察到他们的区别了吗,是的,我们可以调用Object.prototype.toString方法,然后改变方法执行时的this,就能够得到我们想要的结果。因此我们可以这样写我们的逻辑,然后一定是没问题的。

 _typeOf(v)==='Object'  

结尾

相信看完这篇文章后,你的javascript基础一定有所提升。感谢你们的观看,希望这篇文章能给你带来帮助,如果有小伙伴有一些疑惑或者问题,欢迎提出和分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值