首先,我们知道在ECMAScript中有5种基本数据类型(undefined,Null,Boolean,Number和String)。还有一种复杂的数据类型(Object)。鉴于ECMAScript是松散类型,因此需要有一种手段来检测给定变量的数据类型,然而,typeof就是负责提供这方面信息的操作符。
对一个值使用typeof操作符可能返回下列某个字符串:
"undefined" - 如果这个值未定义
"boolean" - 如果这个值布尔值
"string" - 如果这个值是字符串
"number" - 如果这个值是数值
"object" -如果这个值是对象或null
"function" -如果这个值是函数
知道了上面这些知识点之后,下面,进入今天要讲的重点内容。
在工作中,我们时常需要去检测一个值是否是一个对象,通过上面分析,如果直接使用typeof会存在一些缺陷。然而,如何才能让这个判断代码输出结果符合我的意愿呢?需要考虑三个点。
从最基本的这个判断函数开始:
第一个点,Null类型需要排除
null值表示的是一个空对象指针,也就是说:
console.log(isObject(null))
输出:true
这不是我们需要的,所以我们将代码改成下面这样子:
这样的话,就将str为null判断成object的情况过滤掉了。
第二个点,function需要考虑成object
函数通过typeo返回的是一个字符串function。如下所示:
大多数情况下,可能这是我们期望的情况,但有时候我们希望将函数考虑成输出ture的情况。我们的代码可以这么改:
最加了一个typeof(str)全等于function。
第三个点,Array不需要考虑成object
数组通过typeof返回的是一个字符串object。如下所示:
因为数组确实也是一个对象呀,同样在大多数情况下,这也是我们期望的情况 ,但是,有时候我需要将数组考虑输出false的情况,可以往isObject函数里再加一行代码:
为什么要分上面这三点来讲一下了?这样一来,我们可以根据自己的实际情况来考虑需要过虑哪种类型,自由组合代码。
如果同时需要对空值,数组,函数返回false,只让对象返回true,下面这么搞,会更简单。
没错,利用contructor指向来判断。
总结一下:
对于一些这样的判断,在应用层面,也可以使用一些现有库封装好的函数,或者新标准提供的函数。
领取专属 10元无门槛券
私享最新 技术干货