特性 | Cookie | localStorage | sessionStorage | IndexedDB |
---|---|---|---|---|
存储容量 | ~4KB | ~5MB | ~5MB | 几百MB甚至无限 |
生命周期 | 可设置过期时间 | 永久保存 | 会话期间 | 永久保存 |
作用域 | 同源+路径 | 同源 | 同源+标签页 | 同源 |
服务器通信 | 自动发送 | 不发送 | 不发送 | 不发送 |
API复杂度 | 简单字符串 | 简单键值对 | 简单键值对 | 复杂数据库操作 |
数据类型 | 字符串 | 字符串 | 字符串 | 几乎所有JS类型 |
同步/异步 | 同步 | 同步 | 同步 | 异步 |
// 设置Cookie
document.cookie = "username=张三; expires=Fri, 31 Dec 2021 23:59:59 GMT; path=/; domain=example.com; secure; SameSite=Strict";
// 读取Cookie
const cookies = document.cookie.split('; ');
const username = cookies.find(cookie => cookie.startsWith('username=')).split('=')[1];
核心特点:
// 存储数据
localStorage.setItem('userPreferences', JSON.stringify({
theme: 'dark',
fontSize: 'large'
}));
// 读取数据
const preferences = JSON.parse(localStorage.getItem('userPreferences'));
// 删除数据
localStorage.removeItem('userPreferences');
// 清空所有数据
localStorage.clear();
核心特点:
// 存储数据
sessionStorage.setItem('currentSearch', '手机');
// 读取数据
const searchTerm = sessionStorage.getItem('currentSearch');
// 删除数据
sessionStorage.removeItem('currentSearch');
// 清空所有数据
sessionStorage.clear();
核心特点:
// 打开数据库
const request = indexedDB.open('MyDatabase', 1);
// 创建对象仓库
request.onupgradeneeded = function(event) {
const db = event.target.result;
const store = db.createObjectStore('users', { keyPath: 'id' });
store.createIndex('name', 'name', { unique: false });
};
// 添加数据
request.onsuccess = function(event) {
const db = event.target.result;
const transaction = db.transaction(['users'], 'readwrite');
const store = transaction.objectStore('users');
store.add({ id: 1, name: '张三', age: 25, email: '[email protected]' });
transaction.oncomplete = function() {
console.log('数据添加成功');
};
};
// 查询数据
function getUser(id) {
const db = // 获取数据库连接
const transaction = db.transaction(['users']);
const store = transaction.objectStore('users');
const request = store.get(id);
request.onsuccess = function(event) {
console.log('查询结果:', request.result);
};
}
核心特点:
Cookie适合:
localStorage适合:
sessionStorage适合:
IndexedDB适合:
Cookie 就像身份证:
- 随身携带(请求都带着)
- 容量小(只存必要信息)
- 有有效期(可设置过期)
- 特定场合使用(domain/path限制)
localStorage 就像家里的柜子:
- 永久存在(除非主动清理)
- 家人共享(同源窗口共享)
- 不会带出门(不随请求发送)
- 存储空间较大
sessionStorage 就像口袋:
- 临时存放(会话结束即清空)
- 个人专属(不同标签页不共享)
- 随手可取(简单API)
IndexedDB 就像个人数据库:
- 海量存储(容量大)
- 分类整理(索引和结构化)
- 操作复杂(需要特定方法)
- 性能强大(支持复杂查询)
使用Cookie:
// 存储
document.cookie = "userId=12345; max-age=86400; path=/";
document.cookie = "username=张三; max-age=86400; path=/";
// 读取
function getCookie(name) {
const cookies = document.cookie.split('; ');
const cookie = cookies.find(c => c.startsWith(name + '='));
return cookie ? cookie.split('=')[1] : null;
}
const userId = getCookie('userId');
使用localStorage:
// 存储
const user = {
id: 12345,
name: '张三',
preferences: { theme: 'dark' }
};
localStorage.setItem('user', JSON.stringify(user));
// 读取
const userData = JSON.parse(localStorage.getItem('user'));
使用sessionStorage:
// 存储 - 仅会话期间有效
sessionStorage.setItem('currentUser', JSON.stringify({
id: 12345,
name: '张三',
loginTime: new Date().toISOString()
}));
// 读取
const currentUser = JSON.parse(sessionStorage.getItem('currentUser'));
使用IndexedDB:
// 数据库操作封装
const userDB = {
db: null,
open() {
return new Promise((resolve, reject) => {
const request = indexedDB.open('UserDatabase', 1);
request.onupgradeneeded = e => {
const db = e.target.result;
if (!db.objectStoreNames.contains('users')) {
db.createObjectStore('users', { keyPath: 'id' });
}
};
request.onsuccess = e => {
this.db = e.target.result;
resolve(this.db);
};
request.onerror = e => reject(e.target.error);
});
},
saveUser(user) {
return this.open().then(db => {
return new Promise((resolve, reject) => {
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
store.put(user);
tx.oncomplete = () => resolve(user);
tx.onerror = e => reject(e.target.error);
});
});
}
};
// 使用
userDB.saveUser({
id: 12345,
name: '张三',
email: '[email protected]',
orders: [
{ id: 'order1', items: ['商品1', '商品2'] }
]
});
不同存储技术各有优劣,应根据具体需求选择合适的存储方案!