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')
}