以下三种方法用以确定一个值是什么类型。
- typeof运算符
- instanceof运算符
- Object.prototype.toString

typeof运算符返回一个值的数据类型
typeof 123; //"number"
typeof '123'; //"string"
typeof false; //"boolean"
typeof function () { }; //"function" 从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的。--JavaScript高级程序设计
typeof undefined; //"undefined"
由此typeof可以用来检查一个没有声明的变量而不报错;eg:
if(typeof vv === "undefined"){ ... }
typeof null; //"object"
typeof NULL; //"undefined"
typeof {}; //"object"
typeof []; //"object"null的结果也进一步说明了JS中的变量区分大小写。null和NULL是两个不同的变量。
数组[]的类型也是object,这表示在 JavaScript 内部,数组本质上只是一种特殊的对象。

instanceof返回布尔值,表示 对象 是否为某个构造函数的实例
下面这两种写法是等价的;
由于instanceof检查整个原型链,因此同一个实例对象,可能会对多个构造函数都返回true;
原型链的尽头是NULL;
var v = new Array();
v instanceof Array;
v instanceof Object;
Array.prototype.isPrototypeOf(v);
Object.prototype.isPrototypeOf(v); //true但如果左边对象的原型链上只有null对象,instanceof判断会失真,造成这个原因是因为万物皆空,object是null生的吖。
var obj = Object.create(null);
typeof obj; //"object"
obj instanceof Object; //false
对象的toString可以检测对象类型
var toString = Object.prototype.toString;
toString.call(new Date); //"[object Date]"
toString.call(null); // "[object Null]"但是其他数据类型的toString方法会转化为字符串
123..toString(); //"123"
123...toString(); //Uncaught SyntaxError: Unexpected token .
123.toString(); //Uncaught SyntaxError: Invalid or unexpected tokenisArray可以用来检查是不是数组
Array.isArray([]); //true
Array.isArray({}); //false