JavaScript如何检测数据类型?简单,好像又不简单

你好同学,我是沐爸,欢迎点赞、收藏和关注!个人知乎、公众号"沐爸空间"

在JavaScript中,检测数据类型主要有几种方法,每种方法都有其适用场景和优缺点。我们一起来看看吧。

先说结论

  • 使用 typeof 检测基本数据类型,但要排除null
  • 使用 === null 判断是否为 null
  • 使用 Array.isArray() 判断是否为数组
  • 使用 instanceof 判断对象类型
  • 使用 constructor 判断对象类型
  • 使用 Object.prototype.toString.call 方法检测所有数据类型

1.typeof

typeof 可以用来判断基础数据类型。但typeof 不能用于判断 null ,由于 js 最初的设计原因, null 是一个特殊的 object 类型。typeof 判断函数时,返回"function",判断其他引用类型的数据时,都返回"object"。

typeof "John"                // string
typeof 3.14                  // number
typeof NaN                   // number
typeof false                 // boolean
typeof undefined             // undefined
typeof Symbol()              // symbol
typeof 2172141653n           // bigint

typeof null                  // object
typeof function () {}        // function
typeof [1,2,3,4]             // object
typeof {name:'John'}         // object
typeof new Date()            // object
typeof new Set()						 // object
typeof new Map()						 // object

2.=== null

判断一个数据是否为 null,最直接也是最常见的方式是,使用===来进行比较。

let nullVar = null
console.log(nullVar === null) // true

3.Array.isArray()

这是一个专门用于检测数组的方法。如果参数是一个数组,则返回true,否则返回false。这个方法比instanceof更可靠,因为它不会受到原型链被修改的影响。

let arr = []
console.log(Array.isArray(arr)) // true

4.instanceof

这个操作符用于检测一个对象是否是其原型链上某个构造函数的实例。但是,它不能用于基本数据类型的检测。

let arr = []
console.log(arr instanceof Array) // true
    
let obj = {}
console.log(obj instanceof Object) // true
    
let date = new Date()
console.log(date instanceof Date) // true

let s = new Set()
console.log(s instanceof Set) // true

let m = new Map()
console.log(m instanceof Map) // true

let reg = /^a/g
console.log(reg instanceof RegExp) // true

1 instanceof Number // false
'hello' instanceof String // false

5.constructor

借助变量的 constructor 属性,也可以进行类型的判断。但这种方法不够可靠,因为对象的constructor属性可以被修改,且对于基本数据类型(它们没有constructor属性)来说,这种方法不适用。

let arr = []
console.log(arr.constructor.toString()) // 'function Array() { [native code] }'
    
let obj = {}
console.log(obj.constructor.toString()) // 'function Object() { [native code] }'
    
let date = new Date()
console.log(date.constructor.toString()) // 'function Date() { [native code] }'

let s = new Set()
console.log(s.constructor.toString()) // 'function Set() { [native code] }'

let m = new Map()
console.log(m.constructor.toString()) // 'function Map() { [native code] }'

let reg = /^a/g
console.log(reg.constructor.toString()) // 'function RegExp() { [native code] }'

6.Object.prototype.toString.call

这个方法可以准确地区分所有类型,包括基本数据类型(通过包装对象)和对象类型。通过调用Object.prototype.toString.call(value),你可以得到一个字符串,该字符串表示了value的类型。这是检测对象类型最准确的方法之一。

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() 							// '[object Undefined]'
Object.prototype.toString.call(null) 					// '[object Null]'
Object.prototype.toString.call(Symbol()) 			// '[object Symbol]'
Object.prototype.toString.call(2172141653n) 	// '[object BigInt]'
Object.prototype.toString.call([])						// '[object Array]'
Object.prototype.toString.call({})						// '[object Object]'
Object.prototype.toString.call(function(){}) 	// '[object Function]'
Object.prototype.toString.call(new Date())		// '[object Date]'
Object.prototype.toString.call(new Set())			// '[object Set]'
Object.prototype.toString.call(new Map())			// '[object Map]'
Object.prototype.toString.call(/^a/g)					// '[object RegExp]'

推荐方法

  • 对于基本数据类型,使用typeof
  • 对于数组,使用Array.isArray()
  • 对于其他对象类型,使用Object.prototype.toString.call()以获得最准确的类型信息。

你喜欢用哪种方法判断JS的数据类型呢?请评论区告诉我。记得点赞、收藏和关注哦!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐爸muba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值