js数据类型判断的几种方式

这是我参与更文挑战的第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对于数组等这些引用类型的判断。

但是__protoprototype属性是可以被更改的,如果别人改了,可能你得到的结果就是false

附上例子:

function Dog () {}
var dogA = new Dog()
Dog.prototype = {} // 更改了prototype
console.log(dogA instanceof Dog) // false
复制代码

Object.prototype.toString

前面讲了typeofinstanceof2种方式,各有各的优缺点。那有没有什么方法可以解决所有问题,可以判断所有类型?

这时候,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,每种方式都有自己的适用场景,大家根据自己的需求来选择哪种方式。

感谢你们的阅读,希望能帮助你们理解~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享