全面理解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