JavaScript有三种方法,可以确定一个值到底是什么类型。
-
typeof
运算符 -
instanceof
运算符 -
Object.prototype.toString
方法
typeof 运算符
最常用的是 typeof
运算符,返回一个值的数据类型有以下几种结果。
- 原始类型
- 函数
- undefined
- object
1.原始类型
数值、字符串、布尔值分布返回 number
、string
、boolean
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
2.函数
函数返回function
function f() {}
typeof f
// "function"
3. undefined
undefined
和没有用 var
声明的变量,用typeof
返回的是 undefined
typeof undefined
// "undefined"
var x
typeof x
// "undefined"
y
// ReferenceError: y is not defined
typeof y
// "undefined"
这里y
没有用var
声明,直接使用就会报错,但是用typeof
就不报错,而是返回undefined。
实际编程中,这个特点通常用在判断语句。
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
4.object
除了以上三种情况,其他情况都返回object
。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
注意
- 空数组
[]
的返回值是object
,这表示,JavaScript内部,数组本质上是一种特殊的对象。 -
null
的返回值是object
,这是由于历史原因造成的,1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。
为了兼容以前的代码,后来就没法修改了。这并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。
instanceof 运算符
instanceof
是判断变量是否为某个对象的实例,返回值为true
或false
。
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
a instanceof Object // true
typeof
对数组 []
和对象 {}
的返回值都是Object
,无法区分数组和对象,但是instanceof
可以区分。
注意: 数组Array
是对象Object
的一个子类,所以 a instanceof Object
的返回值是 true
。