AutoJs6

- Overview - 综述
- About - 关于文档
- Progress - 文档部署进度
- Changelog - 文档更新日志

- Manual - AutoJs6 使用手册
- Q & A - 疑难解答

- Global - 全局对象
- Automator - 自动化
- AutoJs6 - 本体应用
- App - 通用应用
- Color - 颜色
- Image - 图像
- OCR - 光学字符识别
- Keys - 按键
- Device - 设备
- Storage - 储存
- File - 文件
- Engine - 引擎
- Task - 任务
- Module - 模块
- Plugins - 插件
- Toast - 消息浮动框
- Notice - 消息通知
- Console - 控制台
- Shell
- Media - 多媒体
- Sensor - 传感器
- Recorder - 记录器
- Timer - 定时器
- Thread - 线程
- Continuation - 协程
- Event - 事件监听
- Dialog - 对话框
- Floaty - 悬浮窗
- Canvas - 画布
- UI - 用户界面
- Web - 万维网
- HTTP
- Base64
- Crypto - 密文
- Internationalization - 国际化
- Standardization - 标准化
- E4X

- UiSelector - 选择器
- UiObject - 控件节点
- UiObjectCollection - 控件集合
- UiObjectActions - 控件节点行为
- ImageWrapper - 包装图像类
- App - 应用枚举类
- Color - 颜色类
- Version - 版本工具类
- Polyfill - 代码填泥
- Arrayx - Array 扩展
- Numberx - Number 扩展
- Mathx - Math 扩展

- Exceptions - 异常
- Intent - 意图
- Runtime - 运行时
- Context - 上下文
- Activity - 活动

- Scripting Java - 脚本化 Java
- Android API Level - 安卓 API 级别
- Color Table - 颜色列表

- Glossaries - 术语
- HttpHeader - HTTP 标头
- HttpRequestMethods - HTTP 请求方法
- MimeType - MIME 类型
- NotificationChannel - 通知渠道

- Data Types - 数据类型
- Omnipotent Types - 全能类型
- Storage - 存储类
- AndroidBundle
- AndroidRect
- CryptoCipherOptions
- CryptoKey
- CryptoKeyPair
- ConsoleBuildOptions
- HttpRequestBuilderOptions
- HttpRequestHeaders
- HttpResponseBody
- HttpResponseHeaders
- HttpResponse
- InjectableWebClient
- InjectableWebView
- NoticeOptions
- NoticeChannelOptions
- NoticePresetConfiguration
- NoticeBuilder
- Okhttp3HttpUrl
- OcrOptions
- Okhttp3Request
- OpencvPoint
- OpencvRect
- OpencvSize

- GitHub - 应用项目地址
- GitHub - 文档项目地址

# Storage (存储类)#

存储类 Storage 是一个虚拟类, 实例通常由 storages 全局模块产生:

    /* Storage 为虚拟类, 并非真实存在. */
    typeof global.Storage; // "undefined"

    let sto = storages.create('test');
    sto._storage instanceof org.autojs.autojs.core.storage.LocalStorage; // true

常见相关方法或属性:

- storages.create

Storage

## [m#] put#

### put(key, value)#

`[6.3.0]`

- key { string } - 待存入键名
- value { AnyBut<undefined, bigint> } - 待存入数据
- returns { Storage }

将 `value` 参数经 JSON 序列化后, 与 `key` 参数以键值对形式存入本地存储.

支持存入的数据类型:

- number
- boolean
- string
- null
- Array
- Object
- ... ...

理论上, 除 undefined 和 bigint 外的任意类型数据均可存入本地存储,
试图存入不支持类型的数据时, 将抛出异常.

存入时, 由 JSON.stringify 序列化数据为 string 类型后再存入,
因此数据转换时遵循 JSON 序列化规则 (如 NaN 将被转换为 null 等).

    let sto = storages.create('fruit');
    sto.put('total', 500); /* 存入数字. */
    sto.put('products', [ 'apple', 'banana' ]); /* 存入数组时将被 JSON 序列化.  */

链式调用:

    let sto = storages.create('test');
    sto.put('a', 1).put('b', 2).put('c', 3).put('d', 4);

## [m#] get#

### get(key, defaultValue?)#

`Overload [1-2]/2`

- key { string } - 数据的键名
- [ defaultValue ] { any } - 数据默认值
- returns { any }

读取本地存储中键值与 `key` 参数对应的数据.

当本地存储中不存在键值 `key` 时, 返回 undefined.

本地存储中返回的数据, 来源于 put 方法的 value 参数:

    let sto = storages.create('test');

    sto.put('apple', 10); /* 原始数据是 number 类型的 10. */
    sto.get('apple'); /* 获取的数据依然是 number 类型的 10. */

    sto.put('fruits', [ 'apple', 'banana' ]); /* 原始数据是字符串数组. */
    sto.get('fruits'); /* 获取的数据还原为同类型的字符串数组, 即 ['apple', 'banana']. */

存入时, 由 JSON.stringify 序列化数据为 string 类型后再存入,
读取时, 由 JSON.parse 还原为原本的数据类型.

因此部分数据受 JSON 序列化的影响, 可能导致读取数据与原始数据存在差距:

    sto.put('apple', NaN); /* 原始数据是 number 类型的 NaN. */
    sto.get('apple'); /* 获取的数据是 null. */

## [m#] contains#

### contains(key)#

- key { string } - 键名
- returns { boolean }

返回本地存储中是否存在键值 `key`.

    let sto = storages.create('fruit');
    if (!sto.contains('apple')) {
        sto.put('apple', 10);
    }

## [m#] remove#

### remove(key)#

- key { string } - 键名
- returns { Storage }

移除本地存储中键值 `key` 对应的数据.

    let sto = storages.create('fruit');
    sto.remove('apple').remove('banana').remove('cherry');

## [m#] clear#

### clear()#

- returns { void }

清除本地存储所有数据.

    let sto = storages.create('fruit');
    sto.put('apple', 10);
    sto.get('apple'); // 10
    sto.clear();
    sto.get('apple'); // undefined