JavaScript数据类型判断

112 阅读1分钟

以下三种方法用以确定一个值是什么类型。

  1. typeof运算符
  2. instanceof运算符
  3. 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 token

 isArray可以用来检查是不是数组

Array.isArray([]);    //true
Array.isArray({});    //false