这是我参与更文挑战的第19天,活动详情查看: 更文挑战
前言
我们经常要在代码针对数据类型做判断,比如传参
, 后台返参
等等,今天我们好好讲讲js数据类型的判断的几种方式。
数据类型
在讲判断js数据类型的方式之前,我们先来看看数据类型有哪些:
js一共有2种类型, 基本类型
和引用类型
。
基本类型:String
, Number
, Boolean
, Undefined
, Null
, Symbol
(新引入类型), BigInt
(新引入类型)
引用类型: Object
(其它的比如Array
, Function
等都属于Object
类型)
判断方式
判断方式一般用三种,有typeof
, instanof
, Object.prototype.toString
。我分别一一来讲。
typeof
返回一个字符串,代表着检测元素的类型。
语法:
typeof 判断的元素
附上typeof判断类型的例子:
console.log(typeof '答案cp3') // 'string'
console.log(typeof 123) // 'number'
console.log(typeof true) // 'boolean'
console.log(typeof a) // 'undefined'
var b = null
console.log(typeof b) // 'object' 不是‘null’
console.log(typeof Symbol('答案cp3')) // 'symbol'
console.log(typeof 123n) // 'bigint'
console.log(typeof {}) // 'object'
console.log(typeof []) // 'object'
console.log(typeof function c () {}) // 'function'
console.log(typeof new String('答案cp3')) // 'object'
复制代码
由以上的例子可以看到
typeof
在基本类型的判断基本准确,但是除了null,它返回的object
(这是历史遗留的feature)typeof
在对引用类型的判断就不是很准确,因为[]
返回的是object
, 我们更期望是返回array
,new String('答案cp3')
返回的是object
,,我们期望的是string
我一般把typeof
用在基本类型的判断用的比较多,大家可以根据自己需求来。
instanceof
判断实例是不是构造函数构造出来的实例,主要是用在判断引用类型上, 返回true
则代表是
, false
则代表不是
语法:
判断的元素 instanceof 构造函数
附上instanceof判断类型的例子:
var arr = []
console.log(arr instanceof Array) // true
var obj = {}
console.log(arr instanceof Object) // true
function Dog () {}
var dogA = new Dog()
console.log(dogA instanceof Dog) // true
复制代码
instanceof 用来判断是不是某个构造函数构造出来的实例,内部是使用实例的__proto
属性和构造函数的prototype
属性判断相不相等,相等就返回true
,正常使用没有问题的,可以解决typeof
对于数组等这些引用类型的判断。
但是__proto
和prototype
属性是可以被更改的,如果别人改了,可能你得到的结果就是false
附上例子:
function Dog () {}
var dogA = new Dog()
Dog.prototype = {} // 更改了prototype
console.log(dogA instanceof Dog) // false
复制代码
Object.prototype.toString
前面讲了typeof
和instanceof
2种方式,各有各的优缺点。那有没有什么方法可以解决所有问题,可以判断所有类型?
这时候,Object.prototype.toString
方法登场了。
语法:
Object.prototype.toString.call(判断的元素)
返回字符串,代表判断的元素在Object
内部的数据类型
console.log(Object.prototype.toString.call('答案cp3')) // [object String]
console.log(Object.prototype.toString.call(123)) // [object Number]
console.log(Object.prototype.toString.call(true)) // [object Boolean]
var a
console.log(Object.prototype.toString.call(a)) // [object Undefined]
var b = null
console.log(Object.prototype.toString.call(b)) // [object Null]
console.log(Object.prototype.toString.call(Symbol('答案cp3'))) // [object Symbol]
console.log(Object.prototype.toString.call(123n)) // [object BigInt]
console.log(Object.prototype.toString.call({})) // [object Object]
console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call(function c () { })) // [object Function]
console.log(Object.prototype.toString.call(new String('答案cp3'))) // [object String]
复制代码
强烈推荐这一种方式,基本上对所有数据类型都能判断。
总结
以上就是我总结的js数据类型判断的几种方式,typeof
, instanof
, Object.prototype.toString
,每种方式都有自己的适用场景,大家根据自己的需求来选择哪种方式。
感谢你们的阅读,希望能帮助你们理解~