JavaScript 数据类型详解:从基础到深入

JavaScript 数据类型详解:从基础到深入

个人主页:康师傅前端面馆

在 JavaScript 中,数据类型是编程的基础。JavaScript 是一种弱类型语言,变量本身没有明确的类型限制,而是根据赋给它的值来决定其类型。理解 JavaScript 的基本数据类型、引用类型以及类型检查方法,是掌握这门语言的关键一步。

一、JavaScript 数据类型的分类

JavaScript 中的数据类型可以分为两大类:

1. 基本数据类型(Primitive Types)

这些是最简单的数据单位,不可再分。

类型 描述
undefined 变量未定义时的默认值
null 表示"空"或"无"的值
boolean 布尔值,只有 truefalse
number 数值类型,包括整数和浮点数,也包含 NaNInfinity
string 字符串类型,表示文本信息
symbol ES6 引入,用于创建唯一的标识符
bigint ES2020 引入,用于表示任意精度的整数
javascript 复制代码
let name = "Alice"; // string
let age = 25;       // number
let isStudent = true; // boolean
let id = Symbol("id"); // symbol
let bigNumber = 9007199254740991n; // bigint

2. 引用数据类型(Reference Types)

这些类型存储的是对象的引用地址,而不是实际值。

  • object:对象、数组、函数等都属于 object 类型
  • function:虽然被归为 object 类型,但具有可调用特性
javascript 复制代码
let person = { name: "Bob", age: 30 }; // object
let numbers = [1, 2, 3];                // array (也是 object)
let greet = function() { console.log("Hello!"); }; // function

二、基本数据类型详解

1. undefined

表示一个变量声明了但没有被赋值。

javascript 复制代码
let x;
console.log(x); // undefined

⚠️ 注意:不要手动将变量设置为 undefined,应使用 null 来表示"空值"。

2. null

表示一个"空"或"无效"的引用值,常用于有意清空变量。

javascript 复制代码
let user = null;
console.log(user); // null

⚠️ 特别注意:typeof null 返回 "object",这是一个历史遗留错误。

3. boolean

布尔值用于逻辑判断,只有两个取值:truefalse

javascript 复制代码
let isLoggedIn = true;
if (isLoggedIn) {
  console.log("用户已登录");
}

4. number

JavaScript 中所有数字都是 number 类型,包括整数、浮点数、特殊值如 NaNInfinity

javascript 复制代码
let count = 10;
let price = 19.99;
let notANumber = NaN;
let infinity = Infinity;

⚠️ 浮点数精度问题:

javascript 复制代码
console.log(0.1 + 0.2 === 0.3); // false

5. string

字符串是字符序列,可以用单引号 ' '、双引号 " " 或模板字符串 定义。

javascript 复制代码
let greeting = "Hello";
let template = `欢迎 ${greeting}!`; // 模板字符串

6. symbol

用于创建唯一标识符,不会与其他属性名冲突。

javascript 复制代码
let id = Symbol("user_id");
let user = {
  [id]: 123
};
console.log(user[id]); // 123

7. bigint

用于处理大于 Number.MAX_SAFE_INTEGER 的整数。

javascript 复制代码
let bigIntValue = 9007199254740991n;
console.log(typeof bigIntValue); // "bigint"

三、引用数据类型详解

1. object

对象是键值对集合,是最常用的复杂数据结构。

javascript 复制代码
let person = {
  name: "Alice",
  age: 28,
  sayHello: function() {
    console.log("Hello");
  }
};

2. array

数组是一种特殊的对象,用于有序存储多个值。

javascript 复制代码
let fruits = ["apple", "banana", "orange"];
console.log(fruits[0]); // "apple"

3. function

函数是 JavaScript 中的一等公民,可以作为参数传递、返回值等。

javascript 复制代码
function add(a, b) {
  return a + b;
}
console.log(add(2, 3)); // 5

4. const 与引用类型的特殊行为

虽然 const 声明的变量不能重新赋值,但当变量是对象或数组时,其内部属性或元素仍然可以被修改 。这是因为 const 限制的是变量的内存地址不可变,而不是对象内容本身。

示例 1:修改对象属性
javascript 复制代码
const user = { name: "Alice", age: 25 };
user.age = 30; // 合法,修改对象属性
console.log(user); // { name: "Alice", age: 30 }

// user = { name: "Bob" }; // 报错:Assignment to constant variable.
示例 2:修改数组元素
javascript 复制代码
const colors = ["red", "green"];
colors.push("blue"); // 合法,修改数组内容
console.log(colors); // ["red", "green", "blue"]

// colors = ["yellow"]; // 报错:Assignment to constant variable.
原理说明
  • const 保证的是变量指向的内存地址不变
  • 对象和数组是引用类型,变量存储的是指向堆内存的指针
  • 修改对象属性或数组元素不会改变指针的值,因此允许操作

四、类型检查与转换

1. 使用 typeof 判断类型

适用于基本类型(除 null 外),不适用于对象。

javascript 复制代码
console.log(typeof "hello"); // "string"
console.log(typeof 123);     // "number"
console.log(typeof true);    // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null);    // "object" ------ 错误!

2. 使用 instanceof 判断对象类型

适用于判断某个对象是否是某个构造函数的实例。

javascript 复制代码
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true

3. 显式类型转换

可以使用内置函数进行类型转换:

javascript 复制代码
let str = "123";
let num = Number(str); // 转换为数字
let bool = Boolean(str); // 转换为布尔值

4. 隐式类型转换

JavaScript 在运算中会自动进行类型转换,可能导致意外结果。

javascript 复制代码
console.log("5" - 3);  // 2
console.log("5" + 3);  // "53"
console.log("5" < 6);  // true

五、最佳实践总结

实践建议 说明
使用 constlet 替代 var 更安全的作用域控制
不要手动将变量设为 undefined 推荐使用 null 表示空值
使用 ===!== 进行比较 避免隐式类型转换带来的问题
对象和数组使用深拷贝避免副作用 如使用 JSON.parse(JSON.stringify(obj))
使用 Linter 工具检测潜在类型错误 如 ESLint、TypeScript
使用 TypeScript 提高类型安全性 在大型项目中推荐使用静态类型系统

六、附录:常用类型判断方法汇总

类型 推荐判断方式
undefined typeof x === 'undefined'
null x === null
boolean typeof x === 'boolean'
number typeof x === 'number'Number.isNaN()
string typeof x === 'string'
symbol typeof x === 'symbol'
bigint typeof x === 'bigint'
array Array.isArray(x)
object typeof x === 'object' && x !== null
function typeof x === 'function'
相关推荐
前端摸鱼匠8 分钟前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker29 分钟前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding2 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马2 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren2 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川2 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
Linsk2 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
当时只道寻常2 小时前
浏览器文本复制到剪贴板:企业级最佳实践
javascript
jinanwuhuaguo2 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw