##### 一、数据类型
  js数据类型分基本类型和引用类型。基本类型: Number、Null、undefined、string、Boolean,引用类型: Object、Array(不考虑es6新定义的类型)
##### 二、基本类型和引用类型的判断
```
var a = null //(undefined、string、number、boolean)
a instanceof Object //false
var b = [] //(array、object)
b instanceof Object //true
```
   大的类型判断,一般想到typeof,但是typeof null 为Object,可以用instanceof,instanceof属于object方法,用于判断前部是否属于后部,也可以用Object(a) === a判断是否是引用类型(即对象)。但是判断属于基本类型和引用类型在实际场景中不多,更多的是希望判断细分类型。
##### 三、细分类型的判断
   js 并没有原生的方法直接判断细分类型,可以用Object.prototype.toString方法进行判断,绑定this。
```
Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
```
利用这个特性,可以封装出一个比typeof运算符更准确的类型判断函数,至于为什么Object.prototype.toString() 会出现"[object xxxxx]"这个结果,可以看下这篇文章 http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html。
```
var judgeFun1 = function(o) {
var s = Object.prototype.toString.call(o)
var os = s.slice(8).replace(']','')
return os
}
或者
var judgeFun2 = function(o) {
var s = Object.prototype.toString.call(o)
var os = s.replace( /\[object\s([a-zA-Z]+)\]$/g, '$1')
return os
}
```
此封装函数返回的字符串为类型名称,可以直观的看到。