全面理解JavaScript中数据类型
我们都知道JavaScript(ES5)中有6种数据类型:String
,Number
,Boolean
,Object
,Null
,Undefined
。
有时候我们需要检测一个变量是什么类型,这篇文章就全面的讲解的各种检测方法。
检测基本数据类型
基本数据类型有String
,Number
,Boolean
,Null
,Undefined
五种,检测基本数据类型时使用typeof
来检测。
1 | console.log(typeof 'sunhui'); // string |
注意:在检测null
的时候typeof
返回object
,因此我们需要换另外一种方法来检测null
简单粗暴:
1 | if(obj === null) |
检测引用类型
在使用typeof
来检测对象的时候,返回结果总是object
,有时候我们需要确切的知道该对象是哪个构造函数的实例,就需要用到instanceof
了。
JavaScript里的构造函数有两种,一种是原生的构造函数Array
,Function
,Number
,Boolean
,另一种是自定义的。
1 | //判断数组 |
你应该注意到了,在上述代码中使用instanceof
来判断基本数据类型boolean
和number
的时候,会返回false
,这是因为instanceof
的作用是判断一个对象是否属于某种类型,而基本数据类型不是对象。所以不能使用instanceof
方法来判断。
上面已经有了判断变量是否为Array
和function
的方法。但是这种方法不够安全。主要的问题是当变量在不同的frame之间传递时,各个frame之间同类构造函数并不相等,比如两个frame上的Array
构造函数,虽然都是Array构造函数,但两者并不相等。
因此我们需要一种有绝对把握的检测方法。
ECMAScript5提供了isArray()
方法来判断变量是否为数组
1 | var a = [1,2,3]; |
支持isArray
的浏览器有:IE 9+,Firefox 4+,Safari 5+,Opera 10.5+,Chrome。
检测数组的方法有了,那怎么检测函数呢?其实使用typeof
检测函数时,就会返回function
,问题是在Safari5-以及Chrom7-中检测正则表达式时也会返回function
,因此我们还需要一种准确检测函数的方法。
最强检测方法
直接上代码:
1 | function a(){console.log("yes");} |
看到了吗??简直万能啊。
上述的检测方法是在变量上调用Object的toString
方法。将返回一个遵循[object NativeConstructorName]格式的字符串。其中NativeConstructorName
指的就是变量的构造函数名。
END