前言
JavaScript是一种弱类型的语言,其中数据类型可以说是js的基石,几乎所有的操作都是围绕着这些类型来展开的,先看一张图来了解一下有多少种数据类型
数据类型分类
JavaScript数据类型从分类上来说有两类:基本数据类型 和 引用数据类型, 基本数据类型存在于栈内存中,而引用类型的地址(指针)在栈内存,引用的数据在堆内存
基础数据类型
- string
- number
- boolean
- null
- undefined
- symbol
- bigint
引用数据类型
- object
- function
数据类型判断
typeof
使用typeof可以很方便判断基本类型, 其中null类型比较特殊,判断的结果是object,需要注意,这是由于历史原因导致的
typeof(123) // nubmer
typeOf('abc') // string
typeof(true) // boolean
typeof(a) // undefined
typeof(Symbol('123')) // symbol
typeof(Bigint('')) // bigint
typeof(null) // object
instanceof
instanceof是基于原型和原型链的原理来判断的,用来检测一个对象是否是另外一个对象的实例
function Person(name) {
this.name = name
}
const person = new Person('hello world')
console.log(person instanceof Person) // true
主要用来判断引用类型
const a = {}
a instanceof Object // true
const b = []
b instanceof Object // true
b instanceof Array // true
可以看出数组判断时即是Ojbect也是Array,所以用它判断时要注意
js内部会将person每一层的__proto__与Person的prototype做比较,找到相同返回true,否则返回false
constructor
constructor构造器属性,当一个函数被声明时,js引擎会自动的给函数添加一个prototype原型属性,然后再在perototype上添加一个constructor属性,把它指向函数本身
function Person() {
this.name = 'hello'
}
const person = new Person('hello')
person.constructor === Person // true
主要用来判断引用类型
const a = {}
console.log(a.constructor === Object) // true
const b = []
console.log(b.constructor === Array) // true
由于constructor属性可能会被改写,所以判断时也需要注意
Object.prototype.toString.call()
这种方式是基于Object原型上的toString方法判断的,它几乎可以判断所有的数据类型,比较准确,它返回数据类型对应的字符串描述,如:"[object XXXX]"
Object.prototype.toString.call('123') // "[object String]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(function() {}) // "[object Function]"
Object.prototype.toString.call({}) // "[object Object]"