JS核心原理精讲-基石篇-数据类型

443 阅读2分钟

Part 1 · JavaScript数据类型

一、数据类型的分类

总计8种,其中基础类型7种,引用类型1种。

基础类型(7种)包括:undefined、Null、Boolean、String、Number、Symbol、BigInt
引用类型Object(1种)细分(5类)为:Array、RegExp、Date、Math、Function Object
引用类型又可以细分(11多种):Error、JSON、ArrayBuffer、Map、WeakMap、Set、WeakSet、Promise、Generator、Proxy、Reflect 等等

二、数据类型的区别

储存位置储存内容引用或浅拷贝
基础类型创建完全相等变量
引用类型值的地址多个引用指向同一地址,共享值

三、引用地址

let a = { name: 'Julia',  age: 20 }

function change(o) {
  o.age = 24;
  // 注意:o重新赋值成另一个对象导致引用地址发生改变
  o = { name: 'Kath',age: 30 } 
  return o;
}

let b = change(a);     // 注意这里没有new,后面new相关会有专门文章讲解
console.log(b.age);    // 第一个console
console.log(a.age);    // 第二个console

四、数据类型的检测

1、typeof 可以准确判断基本类型(null除外)
2、如果需要在 if 语句中判断是否为 null,直接通过’=== null‘ 来判断
3、instanceof 可以准确判断复杂引用类型。
4、instanceof 判断原理是通过Object.getPrototypeOf('指定对象') === "6类引用类型".prototype即获取指定对象的原型对象和6类引用类型的原型对象做比较。
5、Object.prototype.toString.call()可以很好的判断JavaScript的数据类型
6、Object.prototype.toString.call() 的判断原理toString()是Object的原型方法,调用该方法可以统一返回格式为“[object Xxx]”的字符串,其中Xxx就是对象的类型
7、由于Object对象的原型对象存在toString可以直接调用,对于其他数据类型需要通过call调用,才能返回正确的类型信息。

// Object.prototype.toString 解决数据类型检测问题
Object.prototype.toString.call(undefined)     // "[object Undefined]"
Object.prototype.toString.call(null)          // "[object Null]"
Object.prototype.toString.call(true)          // "[object Blloean]"
Object.prototype.toString.call('1')           // "[object String]"
Object.prototype.toString.call(1)             // "[object Number]"
Object.prototype.toString.call(Symbol("id"))  // "[object Symbol]"
Object.prototype.toString.call([])            // "[object Array]"
Object.prototype.toString.call(/123/g)        // "[object RegExp]"
Object.prototype.toString.call(new Date())    // "[object Date]"
Object.prototype.toString.call(function(){})  // "[object Function]"
Object.prototype.toString({})                 // "[object Object]"
Object.prototype.toString.call({})            // 同上结果,加上call也ok

五、实现全局通用的数据类型判断方法

function getType(obj) {
    let type = typeof obj
    if (type !== 'object') {
        return type
    }
    return Object.prototype.toString.call(obj)
    .replace(/^\[object (\S+)\]$/, '$1')
}