Skip to content

数据类型总览

数据类型用于回答一个最基础的问题:一个值到底是什么。理解这层内容,能直接影响变量存储、比较、类型转换、参数传递和默认值处理。

JavaScript 的值分成两大类

原始类型

原始类型表示“不可再拆分的基础值”。JavaScript 里常见的原始类型有 7 种:

  • undefined
  • null
  • string
  • number
  • boolean
  • symbol
  • bigint
js
const name = 'Lee'
const age = 18
const done = false

原始类型的特点通常是:

  • 值本身比较轻量
  • 不按对象那样存放属性集合
  • 复制时更接近“直接复制值”

对象类型

除了原始类型,其余都可以归入对象类型。

js
const user = { name: 'Lee' }
const list = [1, 2, 3]
const fn = function () {}

数组、函数、日期、MapSet 等,本质上都属于对象体系。

为什么常说“原始类型 vs 引用类型”

这是一种偏学习阶段的说法,用来帮助理解两件事:

  • 原始值通常直接比较内容
  • 对象值更像通过引用访问同一份实体

更完整内容见 /web/core/ecmascript/data-types/value-vs-reference

常见类型示例

js
typeof undefined // 'undefined'
typeof 'hello' // 'string'
typeof 18 // 'number'
typeof true // 'boolean'
typeof Symbol('id') // 'symbol'
typeof 10n // 'bigint'

typeof {} // 'object'
typeof [] // 'object'
typeof function () {} // 'function'

typeof

typeof 是最轻量、最常用的类型判断方式。

js
console.log(typeof 'hello') // string
console.log(typeof 123) // number
console.log(typeof true) // boolean
console.log(typeof undefined) // undefined
console.log(typeof {}) // object
console.log(typeof function () {}) // function

两个容易记住的例外

js
console.log(typeof null) // object
console.log(typeof []) // object
  • typeof null === 'object' 是历史遗留问题
  • 数组虽然是特殊对象,但 typeof 不会单独返回 array

instanceof

instanceof 更适合判断对象是否来自某个构造体系:

js
console.log([] instanceof Array) // true
console.log(new Map() instanceof Map) // true
console.log(function () {} instanceof Function) // true

它不适合拿来判断原始值:

js
console.log('abc' instanceof String) // false
console.log(1 instanceof Number) // false

因为这些写法里左边是原始值,不是包装对象。

Object.prototype.toString.call

如果想拿到更稳定、更细的内建标签,可以这样做:

js
console.log(Object.prototype.toString.call(null)) // [object Null]
console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call(new Map())) // [object Map]

它常用于:

  • 封装通用类型判断工具
  • 区分数组、对象、日期、正则等内建对象

如何理解 nullundefined

undefined

通常表示“还没有值”或“缺少赋值结果”。

js
let value
console.log(value) // undefined

null

通常表示“有意设置为空”。

js
const user = null

两者都常用于表示缺失,但语义意图不同。

为什么函数会被单独显示为 function

js
typeof function () {} // function

本质上函数仍然属于对象,但 JavaScript 为了方便识别“可调用对象”,让 typeof 对函数返回了单独的结果 function

类型判断怎么选

判断原始类型

优先用 typeof

js
typeof value === 'string'

判断数组

优先用:

js
Array.isArray(value)

判断具体内建对象

可以用:

  • instanceof
  • Object.prototype.toString.call

使用建议

  • 日常判断原始类型,优先用 typeof
  • 判断数组,不要写 typeof arr === 'array',应使用 Array.isArray()
  • 判断 null 时不要依赖 typeof
  • 当类型判断开始变复杂时,优先想清楚业务真正关心的是“数据形态”还是“构造来源”。

基于 MIT 许可发布