JS数据类型检测的方法有哪些
JavaScript中数据类型有哪些
在JavaScript
中,数据类型分为原始类型和对象类型
原始数据类型包括
-
String
:表示一个字符串,例如:’jingzhi‘
-
Number
:表示一个数值,例如:123
-
Boolean
:表示一个布尔类型的数据,值有两种true
和false
-
Null
:表示一个指向不存在或无效的对象或地址引用 -
Undefined
:一个变量未赋值时的状态,表示未定义 -
Symbol
:声明一个符号,符号拥有唯一性,且不能参与运算,例如:const a = Symbol('a')
引用数据类型包括 -
Object
:表示一个对象,例如:var a = {}
-
Function
:表示一个函数,例如function foo() {}
-
Array
:表示一个数组,例如:[1, 2, 3, 4, 5]
- 剩下的还有很多,例如:
Date
、Math
、Set
、Map
等等
JavaScript中检测数据类型的方法有哪些?
typeof
typeof 'a' // 'string'
typeof 1 // 'number'
typeof NaN // number
typeof true // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'
typeof Symbol('a') // 'object'
typeof {} // 'object'
typeof [] // 'object'
typeof /a/ // 'object'
typeof function() {} // 'function'
....
结论:
- 可以看到
typeof
只能检测出除了null
以外的原始数据类型 -
typeof
只能判断对象类型中的Function
,其余的都为Object
instanceof
console.log(1 instanceof Number) // false
console.log(new Number(1) instanceof Number) // true
const arr = []
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
function Fn() {
this.name = '构造函数'
}
Fn.prototype = Object.create(Array.prototype)
let a = new Fn()
console.log(a instanceof Array) // true
instanceof
用来检测构造函数的prototype
属性是否出现在某个实例对象的原型链上,例如:a instanceof B,意为a是否为B的实例,即a的原型链上是否有B
结论:
-
instanceof
可以准确判断引用(对象)类型,但不能准确检测原始类型 - 由于原型的指向是可以修改的,因此这种检测方式不安全
Object.prototype.toString.call()
Object.prototype.toString({}) // '[object Object]'
Object.prototype.toString.call({}) // '[object object]'
Object.prototype.toString.call('a') // '[object String]'
Object.prototype.toString.call(1) // '[object Number ]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(Symbol('a')) // '[object Symbol]'
Object.prototype.toString.call(11n) // '[object BigInt ]'
Object.prototype.toString.call(/a/) // '[object RegExp ]'
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call([0, 1, 2]) // '[object Array]'
Object.prototype.toString.call(function () { }) // '[object Function]'
Object.prototype.toString.call(new Error()) // '[object Error]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new Map()) // '[object Map]'
每个对象都有一个toString()
方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用
默认情况下,toString()
方法被每个Object
对象继承
如果此方法在自定义对象中未被覆盖,toString()
返回 "[object type]"
,其中type
是对象的类型