JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值
- 5种基本数据类型:String Number Boolean Undefined Null
- 引用类型:Object Array Data RegExp Function Error Map …
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值
一、typeof
typeof 用来判断各种数据类型,有两种写法:typeof xxx, typeof(xxx)
1 | var a = 'hzzly'; |
这里面包含了js里面的五种数据类型 number string boolean undefined object和函数类型 function
看到这里你肯定会问了:我怎么去区分对象,数组和null呢?
接下来我们就用到另外两个利器:Object.prototype.toString.call instanceof/constructor
二、Object.prototype.toString.call
1 | var gettype=Object.prototype.toString |
三、instanceof/constructor
根据规定,所有引用类型的值都是Object的实例。因此,在检测一个引用类型值和Object 构造函数时,instanceof 操作符始终会返回true。当然,如果使用instanceof 操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象。
1 | console.log([] instanceof Array); //true |
看到这里,刚才的问题我们解决了
检测数组,ECMAScript5新增了Array.isArray() 方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建。这个方法的用法如下:
1 | if( Array.isArray(value) ){ |
四、题外话
基本类型值与引用类型值具有如下特点:
- 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中
- 从一个变量向另一个变量复制基本类型的值,会创建这个值得一个副本
- 引用类型的值是对象,保存在堆内存中
- 包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向该对象的指针
- 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
好了,遛了遛了。。。