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
相关推荐
睡不着的可乐5 小时前
uniapp 支付宝小程序 扩展组件 component 节点的class不生效
前端·微信小程序·支付宝
前端小书生5 小时前
React Router
前端·react.js
_大学牲5 小时前
Flutter Liquid Glass 🪟魔法指南:让你的界面闪耀光彩
前端·开源
Miss Stone5 小时前
css练习
前端·javascript·css
Nicholas686 小时前
flutter视频播放器video_player_avfoundation之FVPVideoPlayer(二)
前端
文心快码BaiduComate6 小时前
一人即团队,SubAgent引爆开发者新范式
前端·后端·程序员
掘金一周6 小时前
2025年还有前端不会Nodejs ?| 掘金一周 9.25
android·前端·后端
Sailing6 小时前
前端拖拽,看似简单,其实处处是坑
前端·javascript·面试
RoyLin6 小时前
前端·后端·node.js
RoyLin7 小时前
C++ 基础与核心概念
前端·后端·node.js