温故而知新:javascript中的数据类型

57 阅读2分钟

前言

JavaScript是一种弱类型的语言,其中数据类型可以说是js的基石,几乎所有的操作都是围绕着这些类型来展开的,先看一张图来了解一下有多少种数据类型

7abd7f0e5cb044c4ac8033c3b5837b2d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.awebp

数据类型分类

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]"