javascript数据类型有哪些_如何区分它们

JavaScript数据类型共8种,含7种基本类型(String、Number、Boolean、undefined、null、Symbol、BigInt)和1种引用类型(Object);基本类型值存栈、不可变、赋值拷贝值、===比值;引用类型变量存栈中地址、数据存堆、可变、赋值拷贝地址、===比地址;判断类型需组合typeof、Array.isArray()和Object.prototype.toString.call()。

JavaScript 数据类型共 8 种,分为7 种基本类型1 种引用类型(Object)。区分它们的关键不在“叫什么”,而在存储方式、可变性、复制行为和比较逻辑——这些直接决定代码运行时的表现。

基本数据类型:值直接存在栈里,改不了原值

包括:String、Number、Boolean、undefined、null、Symbol、BigInt。它们共同特点是:

  • 值直接存放在栈内存中,空间固定、访问快
  • 赋值时是“拷贝一份新值”,两个变量完全独立
  • 一旦创建,内容不可修改(比如字符串拼接实际是新建字符串)
  • === 比较时,比的是值本身,"a" === "a" 是 true
  • typeof 能准确识别它们(typeof null 是例外,返回 "object",这是历史 bug)

引用数据类型:变量存的是地址,操作的是同一块堆内存

所有以 Object 为原型的类型都属于这一类,比如:Object、Array、Function、Date、RegExp、Map、Set、Promise 等。特点包括:

  • 真实数据存在堆内存,变量在栈中只保存指向它的地址
  • 赋值或传参时拷贝的是地址,多个变量可能指向同一个对象
  • 可以随时增删属性、修改元素,是可变的
  • === 比较时,比的是地址是否相同,[1] === [1] 是 false
  • typeof 对多数返回 "object"(函数例外,返回 "function"),无法区分数组、日期等

怎么准确判断具体类型?别只靠 typeof

单用 typeof 容易踩坑(比如 null[]{} 都是 "object")。推荐组合使用:

  • typeof val:快速筛出基本类型(除 null)和 function
  • val === null:单独判断 null(最直接安全)
  • Array.isArray(val):专用于判断是否为数组
  • Object.prototype.toString.call(val):最可靠通用法,返回 "[object Array]""[object Date]" 等精确标识

一个容易忽略但影响深远的区别:null 和 undefined

它们都是“空”,但语义和来源完全不同:

  • undefined 表示“还没给值”:变量声明未赋值、函数无 return、对象访问不存在属性时返回它
  • null 表示“有意设为空”:开发者主动赋值,表示该处本应有对象,但现在清空了
  • 两者用 == 相等(null == undefined 为 true),但 === 不等;typeof undefined"undefined"typeof null 却是 "object"