Skip to content
On this page

数据类型

数据类型

js 中的数据类型分为,基本数据类型 和 引用数据类型

基本数据类型

常见的基本数据类型:

  • boolean 布尔值
  • string 字符串
  • number 数字
  • null 空值
  • undefined 未定义
  • symbol 符号

区别

  • stringnumberbooleansymbol 这四种类型统称为原始类型

  • symbol 表示独一无二的值,通过 Symbol 函数生成,生成的 symbol 值为原始类型,所以 Symbol 函数不能使用 new 调用

  • nullundefined 通常认为是特殊值,值是唯一的,就是其本身

TIP

基本数据类型大多数是一些简单是数据段,它们 存放在栈中

引用数据类型

常见引用数据类型有:

  • Object(对象)
  • Array (数组)
  • Function (函数)
  • Date (时间)
  • RegExp(正则)
  • 等等。。。

TIP

  • 原始类型存储的是值,对象类型存储的是地址(指针),存在栈中

  • 引用类型的 数据 是保存在 堆中的

  • js 中对引用数据类型的操作,都是操作的对象的引用,而不是对象

数据类型判断

常见的三种判断方式,分别:typeofinstanceofObject.prototype.toString()

typeof

typeof 对于原始数据类型,除了 null 都可以正常显示

javascript
typeof 1          // 'number'

typeof '1'        // 'string'

typeof undefined   // 'undefined'

typeof true       // 'boolean'

typeof Symbol()   // 'symbol'

typeof 对于 引用类型,并不能准确判断

javascript
typeof []           // 'object'

typeof {}           // 'object'

typeof console.log  // 'function'

instanceof

检测构造函数的 prototype 是否出现在被检测的对象的原型链上

它不能检测 null 和 undefined

javascript
[] instanceof Array            // true

({}) instanceof Object         // true

(()=>{}) instanceof Function   // true

注意:instanceof 也不是万能的。原型链的问题

javascript
let arr = []
let obj = {}

arr instanceof Array    // true

arr instanceof Object   // true

obj instanceof Object   // true

Object.prototype.toString()

判断原理:Object.prototype.toString方法的原理

Object.prototype.toString() 返回的 [object Class]

Class 指的是其检测出的数据类型,这是我们判断数据类型的关键

javascript
// 基础类型
Object.prototype.toString.call({})             // '[object Object]'
Object.prototype.toString.call([])             // '[object Array]'
Object.prototype.toString.call(() => {})       // '[object Function]'
Object.prototype.toString.call('seymoe')       // '[object String]'
Object.prototype.toString.call(1)              // '[object Number]'
Object.prototype.toString.call(true)           // '[object Boolean]'
Object.prototype.toString.call(Symbol())       // '[object Symbol]'
Object.prototype.toString.call(null)           // '[object Null]'
Object.prototype.toString.call(undefined)      // '[object Undefined]'

// 引用类型
Object.prototype.toString.call(new Date())     // '[object Date]'
Object.prototype.toString.call(Math)           // '[object Math]'
Object.prototype.toString.call(new Set())      // '[object Set]'
Object.prototype.toString.call(new WeakSet())  // '[object WeakSet]'
Object.prototype.toString.call(new Map())      // '[object Map]'
Object.prototype.toString.call(new WeakMap())  // '[object WeakMap]'

数据类型转化

将值从一种类型转换为另一种类型称为类型转换

在 JavaScript 中类型转换都属于强制类型转换。

强制类型又分为隐式强制类型显式强制类型

javascript
let a = 10

let b = a + ''      // 隐式强制类型 

let c = String(a)   // 显式强制类型

隐式类型转换

隐式转换

  • 通过 ToNumber 将值转换为数字,只要有 number 参与就会转换
参数结果过程
true1true 转换为数字 1
null0null 转换为 数字 0
undefinedNaNundefined 转换为数字是 NaN
['5']5['5'] 首先转换变成'5',然后变成数字5

强制类型转换

  1. 转换成 Number 类型方法:Number()parseFloat()parseInt()

  2. 转换成 String 类型方法:String()toString()

  3. 转换成 Boolean 类型 方法:Boolean()

面试题

  • const 为什么不能重新赋值、重新声明
    1. const 指针指向不可以改变,指向地址的内容是可以改变的
    2. 因为 const 只是保证了对象的的指针不变,而对象的内容改变不会影响到指针的改变,所以对象属性是可以修改的

参考

玩转 JavaScript 之数据类型

前端基础进阶(一):内存空间详细图解

隐式转换