引言
很多小伙伴可能对于object
类型的判断会写出错误的逻辑,可能写错了自己还不知道,那是因为你对javascript
的数据类型和相关语法可能不是很熟,还有就是javascript
的object
类型包含很多种数据类型,下面由我来帮助你们解答这些疑问。
object包含的类型
下面使用你们常用的判断方法来演示,typeof
和instanceof
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
由此可见,使用typeof
和instanceof
检查引用(object)类型时,除了函数特殊之外,其他都为object
类型。
你真的了解instanceof 吗
instanceof
从字面上很容易让人误解它的意思,a instanceof b
字面上理解就是 a是由b创建的实例,在一定程度上可以这么理解,但是并非如此。instanceof
的真正含义是:在原型链中,a的父辈或者祖辈是 b.prototype
,也就是b.prototype
在a
的原型链上端,对原型链还不够了解的小伙伴,可以看看我发的关于原型链的一篇文章 -->原型链详解。
如何判断一个数据是否为纯对象类型
什么是纯对象类型,这里其实是我自己起的一个名字,就是值为 {}
之类的数据。看过上面的例子后,你会发现使用typeof
和instanceof
来判断,在某些场景是会出错的,显然不够严谨。下面看一个例子你就会明白如何正确的来判断一个数据是否为纯对象
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
基础一定有所提升。感谢你们的观看,希望这篇文章能给你带来帮助,如果有小伙伴有一些疑惑或者问题,欢迎提出和分享。