因为javascript属于动态数据类型,所以对某个变量进行操作前,有时需要检查它的数据类型是什么,方可进行下一步的操作。
JavaScript 有三种方法,可以确定一个值到底是什么类型。
typeof
运算符instanceof
运算符Object.prototype.toString
方法
typeof运算符
typeof 测试基本类型(数值,字符串,布尔值,未赋值的变量或未定义的变量),分别返回"number"、"string"、"boolean"和 "undefined"。
typeof测试引用类型(数组,对象,函数),测试数组和对象都返回"object", 检查函数类型返回"function"。
let a = 5
console.log(typeof a) //输出number
a = "zhang"
console.log(typeof a) //输出string
a = [1, 2, 3]
console.log(typeof a) //输出object
a = {
name: 'zhang',
age: 20
}
console.log(typeof a) //输出object
a = function () {
}
console.log(typeof a) //输出function
let b;
console.log(typeof b) //输出undefined
let c = null
console.log(typeof c) //输出object
console.log(typeof d) //检测一个未声明的变量,返回undefined
使用typeof检测数组和对象,返回的都是object 。这表示在 JavaScript 内部,数组本质上只是一种特殊的对象。
检查一个未声明的变量,可以用typeof。
// 错误的写法
if (v) {
// ...
}
// 正确的写法
if (typeof v === "undefined") {
//....
}
在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。这就需要用到instanceof来检测某个对象是不是另一个对象的实例。
instanceof运算符
instanceof 运算符用于判断一个变量是否某个对象的实例,返回一个布尔值。
var arr = [1, 2, 3]
console.log(arr instanceof Array) //输出true
var obj = {
name: 'zhang',
age: 20
}
console.log(obj instanceof Object) //输出true
var fn = function () { }
console.log(fn instanceof Function) //输出true
instanceof
运算符的左边是实例对象,右边是构造函数。它会检查右边构造函数的原型对象(prototype),是否在左边对象的原型链上。
function Student() { } //学生对象的构造函数
function Teacher() { } //老师对象的构造函数
var stu = new Student()
console.log(stu instanceof Student) //输出true
console.log(stu instanceof Teacher) //输出false
// JavaScript 的所有其他对象都继承自Object对象,即那些对象都是Object的实例。
console.log(stu instanceof Object) //输出true
let arr = [1, 2, 3]
//数组也继承了Object对象
console.log(arr instanceof Object) //输出true
let today = new Date()
console.log(today instanceof Date) //输出true
console.log(today instanceof Object) //输出true
Object.prototype.toString
方法
Object.prototype.toString
方法返回对象的类型字符串,因此可以用来判断一个值的类型。
Object.prototype.toString.call(value)
上面代码表示对value
这个值调用Object.prototype.toString
方法。
不同数据类型的Object.prototype.toString
方法返回值如下。
- 数值:返回
[object Number]
。 - 字符串:返回
[object String]
。 - 布尔值:返回
[object Boolean]
。 - undefined:返回
[object Undefined]
。 - null:返回
[object Null]
。 - 数组:返回
[object Array]
。 - arguments 对象:返回
[object Arguments]
。 - 函数:返回
[object Function]
。 - Error 对象:返回
[object Error]
。 - Date 对象:返回
[object Date]
。 - RegExp 对象:返回
[object RegExp]
。 - 其他对象:返回
[object Object]
。
这就是说,Object.prototype.toString
可以看出一个值到底是什么类型。
let a = 20
console.log(Object.prototype.toString.call(a)) // "[object Number]"
let b = "zhang"
console.log(Object.prototype.toString.call(b)) // "[object String]"
console.log(Object.prototype.toString.call(true)) // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)) // "[object Undefined]"
console.log(Object.prototype.toString.call(null)) // "[object Null]"
let obj = {
name: 'zhang',
age: 20
}
console.log(Object.prototype.toString.call(obj)) // "[object Object]"
let arr = [1, 2, 3]
console.log(Object.prototype.toString.call(arr)) // "[object Array]"