主题
数据类型总览
数据类型用于回答一个最基础的问题:一个值到底是什么。理解这层内容,能直接影响变量存储、比较、类型转换、参数传递和默认值处理。
JavaScript 的值分成两大类
原始类型
原始类型表示“不可再拆分的基础值”。JavaScript 里常见的原始类型有 7 种:
undefinednullstringnumberbooleansymbolbigint
js
const name = 'Lee'
const age = 18
const done = false原始类型的特点通常是:
- 值本身比较轻量
- 不按对象那样存放属性集合
- 复制时更接近“直接复制值”
对象类型
除了原始类型,其余都可以归入对象类型。
js
const user = { name: 'Lee' }
const list = [1, 2, 3]
const fn = function () {}数组、函数、日期、Map、Set 等,本质上都属于对象体系。
为什么常说“原始类型 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 []) // objecttypeof 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]它常用于:
- 封装通用类型判断工具
- 区分数组、对象、日期、正则等内建对象
如何理解 null 和 undefined
undefined
通常表示“还没有值”或“缺少赋值结果”。
js
let value
console.log(value) // undefinednull
通常表示“有意设置为空”。
js
const user = null两者都常用于表示缺失,但语义意图不同。
为什么函数会被单独显示为 function
js
typeof function () {} // function本质上函数仍然属于对象,但 JavaScript 为了方便识别“可调用对象”,让 typeof 对函数返回了单独的结果 function。
类型判断怎么选
判断原始类型
优先用 typeof:
js
typeof value === 'string'判断数组
优先用:
js
Array.isArray(value)判断具体内建对象
可以用:
instanceofObject.prototype.toString.call
使用建议
- 日常判断原始类型,优先用
typeof。 - 判断数组,不要写
typeof arr === 'array',应使用Array.isArray()。 - 判断
null时不要依赖typeof。 - 当类型判断开始变复杂时,优先想清楚业务真正关心的是“数据形态”还是“构造来源”。
