JavaScript的变量和数据类型有哪些?

JavaScript变量无类型,类型属于值;基本数据类型共7种,不可变且按值传递,如string表示文本。

JavaScript 的变量本身没有类型,类型是绑定在值上的;变量只是指向某个值的“名字”。真正重要的是数据类型——它决定了你能对这个值做什么操作。

基本数据类型(Primitive Types)

共 7 种,都是不可变的、按值传递:

  • string:文本,如 "hello"'world'423.14NaN
  • boolean:只有两个值:truefalse
  • null:一个独立的原始值,表示“空值”或“有意缺失的对象引用”
  • undefined:变量声明了但未赋值时的默认值,也用于对象中不存在的属性
  • symbol:ES6 新增,用于创建唯一标识符,常用于对象属性名避免冲突
  • bigint:ES2025 新增,表示任意精度的整数,用 123n 语法创建

引用数据类型(Object Types)

所有非原始类型的值都属于这一类,本质是对象(包括函数、数组等),按引用传递:

  • object:普通对象,如 { name: "Alice", age: 30 }
  • array:有序集合,如 [1, 2, 3] —— 实际上是特殊对象,有 length 和方法
  • function:函数也是对象,可赋值、传参、返回,如 function foo() {}
  • date:日期对象,如 new Date()
  • regexp:正则表达式对象,如 /abc/g
  • mapset:ES6 新增的集合类型,支持键值对或唯一值存储
  • weakmapweakset:弱引用版本,不影响垃圾回收
  • promise:异步操作的占位符对象
  • proxyreflectiterator 等高级内置对象

变量声明方式与行为差异

JS 提供三种声明变量的关键字,影响作用域和提升行为:

  • var:函数作用域,会变量提升(hoisting),可重复声明
  • let:块级作用域,会提升但不初始化(暂时性死区 TDZ),不可重复声明
  • const:块级作用域,声明后必须赋值,且不能重新赋值(注意:对象/数组内容仍可修改)

如何判断数据类型?

没有万能方法,需组合使用:

  • typeof:适合判断原始类型(但 typeof null === "object" 是历史 bug)
  • Array.isArray():准确判断是否为数组
  • instanceof:检测对象是否由某构造函数创建(依赖原型链)
  • Object.prototype.toString.call(x):最可靠,返回 "[object Type]" 字符串

基本上就这些。理解类型归属和变量行为,比死记数量更重要——尤其注意 null 的 typeof 返回 "object",以及 const 声明的对象不是“不可变”,只是不能重新赋值。