JS数据类型管理
因为JS是一种弱类型语言,在声明变量时不必声明变量类型;变量的类型由运行中存储的数据类型决定,因此变量的类型是随机变化的,为此为保证代码运行的严谨性和代码运行时因隐式转换而导致变量类型的变化所致出现异常情况,我们经常需要对变量类型进行验证处理。因此我们在写代码时要对自己定义的变量类型进行有效的管理,这样能避免很多意外bug和提高debug的效率。
一、JS数据类型
JS总共有7种数据类型,如下所示:
1、 6种原始数据类型
1)String
2) Number
3) Boolean
4) Null
5) Undefine
6) Symbol (es6)
2、复合数据类型
1) Object
二、JS数据类型判断
1、typeof
typeof操作符能辨别基本的数据类型,并且返回值为表示该数据类型的字符串 ; 但是其能力有限,只能用于来区别原始数据类型,对于其Object类型中的Array、Date 、RegExp 及其 Null 类型无法细分出
注意:typeof(null) = ' object '
null类型判断方法:
variable === null // true 为 null
variable == null // true 为 null 或者 undefined
2、 instanceof
用法:object instanceof constructor
instanceof 运算符用来检测一个构造函数的prototype属性是否存在一个对象的原型链上,即检测该对象是否是一个构造函数的实例化
(1)可以通过Object.getPrototypeof(object)方法来查看该对象的原型,即该对象内部属性[[Prototype]]的值
如果 Object.getPrototypeof(object) === constructor.prototype
则该所检测对象一定是所测试的构造函数的实例化
var arr = [] , reg = /\bis\b/g , str1 = new String(), str2 = 'aaa'; arr instanceof Array // true arr instanceof Object // true arr instanceof RegExp // false reg instanceof RegExp // true str1 instanceof String // true str2 instanceof String // false
因此我们可以通过 instanceof 运算符对object类型的数据进一步判断来区分 Array、Date 、RegExp 及其 Null 类型
3、constructor属性
实例化的对象都有constructor属性,其constructor属性指针指向的是构造函数,可用来判断未知对象的类型
所以上面的判断方法也可以写成下面的判断方式
arr.constructor === Array // true arr.constructor === Object // true arr.constructor === RegExp // false reg.constructor === RegExp // true str.constructor === String // true
4、Object.prototype.toString.call()
a = 'hello' b = [] c = function(){} Object.toString.call(a) === "[object String]" Object.toString.call(b) === "[object Array]" Object.toString.call(c) === "[object Function]"