JavaScript 有三种方法,可以确定一个值到底是什么类型。
typeof运算符
instanceof运算符
Object.prototype.toString方法
typeof 运算符:
数值、字符串、布尔值分别返回number、string、boolean。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。
v// ReferenceError: v is not defined
typeof v
// "undefined"
上面代码中,变量v没有用var命令声明,直接使用就会报错。但是,放在typeof后面,就不报错了,而是返回undefined。
typeof null // "object"
typeof null返回object;
null的类型是object,这是由于历史原因造成的。1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑null,只把它当作object的一种特殊值。后来null独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null返回object就没法改变了。
instanceof运算符:
instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例。
var v = new Vehicle();
v instanceof Object // true
v instanceof Vehicle // true
// 等同于
Vehicle.prototype.isPrototypeOf(v)
null instanceof Object // false
只有null对象。这时,instanceof判断会失真。
*注意,instanceof运算符只能用于对象,不适用原始类型的值。
下面代码中,字符串不是String对象的实例(因为字符串不是对象),所以返回false。
此外,对于undefined和null,instanceof运算符总是返回false。
var x = [1, 2, 3];var y = {};
x instanceof Array // true
y instanceof Object // true
var s = 'hello';
s instanceof String // false
undefined instanceof Object // false
null instanceof Object // false
所以,利用instanceof运算符,还可以巧妙地解决,调用构造函数时,忘了加new命令的问题。