这是一个非常关键且容易混淆的概念
既然 this.globalData.appId = appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:storage 不就是内存吗?
关键区别:
您提出的疑问揭示了一个核心概念:微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域,它们之间有本质的区别。
-
内存(Memory):
- 临时存储: 内存是 临时性 的存储区域,用于存储程序运行时的数据。
- 快速访问: 内存的读写速度非常快,因此访问内存中的数据效率很高。
- 生命周期: 内存中的数据随着程序(这里指小程序)的启动而创建,随着程序的关闭而释放。
- 全局数据: 使用
this.globalData = {}方式定义的数据, 例如this.globalData.appId等, 都是存储在内存中的。 - 例子:
- JavaScript 变量 (如
const appId = ...) - 小程序实例的全局数据 (
this.globalData) - 函数调用栈
- JavaScript 变量 (如
-
本地存储(
wx.setStorage/wx.getStorage):- 持久化存储: 本地存储是 持久化 的存储区域,用于存储需要在小程序关闭后仍然保留的数据。
- 读写速度较慢: 本地存储的读写速度比内存慢,因为需要进行文件 I/O 操作。
- 容量限制: 本地存储通常有一定的容量限制,微信小程序也有限制, 请注意控制存储数据的大小。
- 生命周期: 本地存储中的数据会一直存在,直到被显式删除或小程序被卸载。
- 删除: 可以通过
wx.removeStorage来删除本地存储。 - 清空: 可以通过
wx.clearStorage来清空本地存储。
- 删除: 可以通过
- 例子:
- 用户登录状态
- 用户设置信息
- 缓存的 API 响应数据
storage 和内存的本质区别:
| 特性 | 内存 (Memory) | 本地存储 (Storage) |
|---|---|---|
| 类型 | 临时存储 | 持久化存储 |
| 读写速度 | 非常快 | 较慢 |
| 容量 | 有限,受设备限制 | 有限,受小程序限制 |
| 数据生命周期 | 随程序运行而存在,随程序关闭而释放 | 除非被删除或者小程序卸载,一直存在 |
为什么本地存储中没有 appId:
- 您没有显式地使用
wx.setStorageAPI 存储appId:- 您只是将
appId存储在了内存中,通过this.globalData.appId = appId赋值,并没有将appId使用wx.setStorageAPI 存储到本地存储中。
- 您只是将
- 本地存储中只保存了您明确调用
wx.setStorage存储的数据:- 微信小程序只会在您调用
wx.setStorage或wx.setStorageSyncAPI 时,才会将数据存储到本地存储。
- 微信小程序只会在您调用
总结:
- 内存和本地存储是完全不同的概念: 内存是临时的,本地存储是持久的。
- 您只是将
appId存储在了内存中: 使用this.globalData.appId = appId, 并没有存储到本地存储中。 - 本地存储需要显式调用
wx.setStorage: 您需要使用wx.setStorage或wx.setStorageSyncAPI,才能将数据存储到本地存储。
如何将 appId 存储到本地存储?
如果您希望将 appId 存储到本地存储,您需要在设置 this.globalData.appId 的同时,显式地调用 wx.setStorage 或 wx.setStorageSync:
// app.js
App({globalData: {appId: null},onLaunch: function() {// 获取当前小程序 appidconst appId = wx.getAccountInfoSync().miniProgram.appId;this.globalData.appId = appId;wx.setStorageSync('appId', appId)console.log('appId:', appId);},
});
在其他页面获取本地存储的 appId:
const appId = wx.getStorageSync('appId');
storage 和内存的区别,以及为什么本地存储中没有 appId.
