今天让我们一起学习一下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() 方法:
- 如果
toString()接收的值是undefined,则返回"[object Undefined]" - 如果
toString()接收的值是null,则返回"[object Null]" - 调用
ToObject(o),将o转为对象,此时得到的对象的内部一定拥有一个属性:[[Class]],而这个属性[[class]]的值就是o的类型 - 设
class是[[class]]的值 - 返回由" [object" 和 class 和 "] "拼接得到的字符串
“[object class]”
而之所以再调用一个.call()方法是因为所有类型身上都有一个toString()方法,但是只有Object.prototype身上的toString()方法才能进行类型判断,所以用.call()方法改变this指向,让需要判断的数据用上Object.prototype上的toString()方法。
以上就是JS中常见的三种类型判断的方法,希望可以帮助到大家!!