js中的类型判断

151 阅读2分钟

今天让我们一起学习一下js中那些常用的类型判断的方法:

常用的有三种方法,分别是typeof关键字:用于判断原始数据类型

instanceof关键字:用于判断引用数据类型

Object.prototype.toString.call()方法:可以判断所有类型

typeof关键字

在js中,typeof可以返回一个表示数据类型的字符串,但适用于原始数据类型的判断,不适用于引用类型判断。

用法

typeof variable

let str = 'hello'
let num = 123
let flag = false
let un = undefined
let n = null

console.log(typeof str); //string typeof 
console.log(typeof num); //number typeof 
console.log(typeof flag); //boolean
console.log(typeof un); //undefined
console.log(typeof(n)); //object

通过上面这段代码我们可以知道,typeof可以判断除null以外所有的原始数据类型(判断null时会返回object)。

而对于引用类型的判断,typeof同样也有不准确的地方:

let obj = {}
let arr = []
let fn = function () {}
let date = new Date()

console.log(typeof(obj)); //object
console.log(typeof(arr)); //object
console.log(typeof(fn)); //function
console.log(typeof(date)); //object

typeof无法判断Function以外的引用数据类型(都会返回object)。

instanceof关键字

instanceof可以检测某实例对象的原型链上是否有某构造函数的prototype属性(对这个不理解的朋友可以先看看主页的《原型与原型链》文章),以此可以用于引用类型的判断

用法

variable instanceof Constructor

let obj = {}
let arr = []
let fn = function () {}
let date = new Date()

console.log(obj instanceof Object); // true
console.log(arr instanceof Array); // true
console.log(fn instanceof Function); // true
console.log(date instanceof Date); // true

如:fn是引用类型Function的实例对象,则返回ture

但当我们使用instanceof关键字时,还有一点需要注意:因为instanceof是根据原型链进行查找,而引用类型实例的__proto__最终都会指向Object.prototype,所以当我们用instanceof判断某引用类型实例是不是Object类型时,一定会返回ture

let arr = []
console.log.(arr instanceof Object)//ture

Object.prototype.toString.call()方法

这个方法能够准确地判断所有类型

用法

Object.prototype.toString.call(1)   // "[object Number]"
Object.prototype.toString.call("hello")   // "[object String]" 
Object.prototype.toString.call(true)   // "[object Boolean]" 
Object.prototype.toString.call(undefined)   // "[object Undefined]" 
Object.prototype.toString.call(null)   // "[object Null]" 
Object.prototype.toString.call([])   // "[object Array]"

这个方法其实是先调用了Object.prototype上的toString() 方法:

  1. 如果toString()接收的值是undefined,则返回"[object Undefined]"
  2. 如果toString()接收的值是null,则返回"[object Null]"
  3. 调用ToObject(o),将o转为对象,此时得到的对象的内部一定拥有一个属性:[[Class]] ,而这个属性[[class]]的值就是o的类型
  4. class[[class]]的值
  5. 返回由" [object" 和 class 和 "] "拼接得到的字符串“[object class]”

而之所以再调用一个.call()方法是因为所有类型身上都有一个toString()方法,但是只有Object.prototype身上的toString()方法才能进行类型判断,所以用.call()方法改变this指向,让需要判断的数据用上Object.prototype上的toString()方法。

以上就是JS中常见的三种类型判断的方法,希望可以帮助到大家!!