JavaScript 的基本数据类型

在 JavaScript 中,数据类型可以分为两大类:原始类型(基本类型)引用类型(对象类型)

原始类型 的值是直接存储在栈内存中的简单数据段,它们是按值访问的。操作的是实际的值。
引用类型 的值是存储在堆内存中的对象,栈内存中存储的是对象的引用地址。操作的是对象的引用。


一、七种基本数据类型(ES6 之后)

ES5 中有5种基本数据类型,ES6 新增了 Symbol,ES2020 新增了 BigInt。所以目前共有 7种

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Symbol (ES6 新增)
  7. BigInt (ES2020 新增)

二、每种类型详解

1. Undefined 类型

含义 :表示一个变量已被声明但尚未被赋值,或者根本不存在。
:只有一个值,就是 undefined

javascript 复制代码
let a;
console.log(a); // 输出:undefined
console.log(typeof a); // 输出:"undefined"

// 访问一个未声明的变量会报错,但使用 typeof 是安全的
// console.log(b); // 会报错:ReferenceError: b is not defined
console.log(typeof b); // 输出:"undefined" (这是一个历史遗留的"安全特性")

2. Null 类型

含义 :表示一个"空"值,即"没有对象"。
:只有一个值,就是 null

javascript 复制代码
let empty = null;
console.log(empty); // 输出:null
console.log(typeof empty); // 输出:"object" (这是一个著名的 JavaScript 历史 Bug)

注意typeof null 返回 "object" 是语言本身的一个错误,但它已被广泛使用,无法修复。

Undefined 与 Null 的区别

  • undefined 是表示系统级的、出乎意料的或类似错误的"空值"。
  • null 是表示程序级的、正常的或意料之中的"空值"。
  • 在非严格相等(==)下,undefined == nulltrue;在严格相等(===)下,undefined === nullfalse

3. Boolean 类型

含义 :表示逻辑实体,真或假。
:只有两个值:truefalse

javascript 复制代码
let isLoggedIn = true;
let isEmpty = false;

布尔转换(Falsy Values)

在条件判断(如 if 语句)中,其他类型的值会自动转换为布尔值。以下值会被转换为 false,称为 "假值"

  • false
  • undefined
  • null
  • 0-0NaN
  • "" (空字符串)
  • document.all(一个历史遗留特性)

所有其他值(包括空数组 []、空对象 {})都会被转换为 true

javascript 复制代码
console.log(Boolean(0)); // false
console.log(Boolean("hello")); // true
console.log(Boolean("")); // false
console.log(Boolean({})); // true (注意!)
console.log(Boolean([])); // true (注意!)

4. Number 类型

含义 :表示整数和浮点数(双精度 64 位二进制格式 IEEE 754)。
特殊值NaN (Not a Number)、+Infinity (正无穷)、-Infinity (负无穷)。

javascript 复制代码
let integer = 42;
let float = 3.14159;
let negative = -10;
let scientific = 2.998e8; // 2.998 * 10^8

// 特殊值
let notANumber = NaN;
let infinity = Infinity;

NaN 的特点

  • NaN 是唯一一个不等于自身的值。
  • 使用 isNaN() 或更现代的 Number.isNaN() 来判断一个值是否为 NaN
javascript 复制代码
console.log(NaN === NaN); // false
console.log(isNaN(NaN)); // true
console.log(isNaN("abc")); // true (会先尝试转换为数字)
console.log(Number.isNaN("abc")); // false (只有确实是 NaN 时才返回 true,推荐使用)

5. String 类型

含义 :表示文本数据,由 16 位无符号整数值(UTF-16 编码)的"元素"组成。
表示 :可以用单引号(')、双引号(")或反引号(`````)表示。

javascript 复制代码
let name1 = 'Alice';
let name2 = "Bob";
let greeting = `Hello, ${name1}!`; // 模板字符串,可以嵌入变量和表达式

console.log(greeting); // 输出:Hello, Alice!

特点

  • 字符串是不可变的(immutable)。一旦创建,无法直接修改其中的字符。所有字符串方法(如 toUpperCase(), slice())都会返回一个新字符串,而不会改变原字符串。
javascript 复制代码
let str = "hello";
str[0] = "H"; // 这个操作是无效的
console.log(str); // 输出仍然是 "hello"

let newStr = str.toUpperCase();
console.log(newStr); // 输出 "HELLO"
console.log(str); // 输出仍然是 "hello"

6. Symbol 类型 (ES6)

含义 :表示唯一的、不可变的值,主要用于对象的属性名,以避免属性名冲突。
创建 :通过 Symbol() 函数创建。

javascript 复制代码
let sym1 = Symbol();
let sym2 = Symbol("description"); // 可以传入一个可选的描述字符串
let sym3 = Symbol("description");

console.log(sym2 === sym3); // false,每个 Symbol 都是唯一的,即使描述相同
console.log(sym2.description); // 输出 "description"

主要用途

  • 作为对象的唯一属性键。
  • 用于定义对象的"元"属性或内部方法(例如,Symbol.iterator 用于定义迭代器)。
javascript 复制代码
const MY_KEY = Symbol();
let obj = {};

obj[MY_KEY] = "secret value"; // 使用 Symbol 作为键
console.log(obj[MY_KEY]); // 输出 "secret value"

// 常规的 for...in 循环或 Object.keys() 无法遍历到 Symbol 键
for (let key in obj) {
  console.log(key); // 无输出
}

7. BigInt 类型 (ES2020)

含义 :用于表示任意精度的整数。解决了 Number 类型无法安全表示大于 2^53 - 1Number.MAX_SAFE_INTEGER)的整数的问题。
创建 :在一个整数字面量后面加 n,或者调用 BigInt() 函数。

javascript 复制代码
const bigNumber = 9007199254740991n; // 字面量加 n
const alsoBig = BigInt(9007199254740991); // 使用 BigInt 函数

console.log(typeof bigNumber); // "bigint"

// 超出 Number 安全范围的计算
console.log(9007199254740991n + 1n); // 正确:9007199254740992n
console.log(Number(9007199254740991) + 1); // 错误:可能得到 9007199254740992 或精度丢失的结果

注意

  • BigInt 不能和 Number 直接进行混合数学运算,需要先转换为同一类型。
javascript 复制代码
// console.log(1n + 2); // 报错:TypeError: Cannot mix BigInt and other types
console.log(1n + BigInt(2)); // 正确:3n
console.log(Number(1n) + 2); // 正确:3

三、如何检测数据类型:typeof 操作符

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

类型 typeof 返回值 示例
Undefined "undefined" typeof undefined
Null "object" (历史 Bug) typeof null
Boolean "boolean" typeof true
Number "number" typeof 42
String "string" typeof "hello"
Symbol "symbol" typeof Symbol()
BigInt "bigint" typeof 9007199254740991n
Function (对象) "function" typeof function(){}
其他所有对象 "object" typeof {}typeof []

注意typeof 对于数组和普通对象都返回 "object"。要区分它们,需要使用 Array.isArray() 或其他方法。

javascript 复制代码
console.log(typeof []); // "object"
console.log(Array.isArray([])); // true

console.log(typeof {}); // "object"
console.log(typeof null); // "object"

总结

数据类型 含义 关键特性
Undefined 未定义 变量声明未赋值
Null 空值 typeof null === 'object' (Bug)
Boolean 布尔值 true / false, falsy values 需注意
Number 数字 双精度浮点数,包含 NaN, Infinity
String 字符串 不可变,可用模板字符串
Symbol 唯一值 用于创建对象的唯一属性键
BigInt 大整数 表示任意精度的整数,后缀 n
相关推荐
Mr.Jessy4 小时前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
白兰地空瓶6 小时前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
爱上妖精的尾巴6 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
似水流年QC7 小时前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
陪我去看海7 小时前
测试 mcp
前端
speedoooo8 小时前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
全栈胖叔叔-瓜州8 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
三七吃山漆8 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569158 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
GISer_Jing8 小时前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能