deterministicStringify()
function deterministicStringify(val): string;
Defined in: packages/rxdb/src/rxdb-utils.ts:223
确定性的 JSON.stringify
通过对 object 的键进行排序,确保相同内容但具有不同键顺序的对象能够生成相同的缓存 Key。
Parameters
| Parameter | Type |
|---|---|
val | unknown |
Returns
string
Remarks
输出直接用作查询缓存 key(QueryManager.createTask)和数据指纹
(QueryCacheEngine.#computeDataFingerprint),因此两个语义不同的输入绝不能
映射到同一字符串 —— 那等于把 A 查询的结果发给 B 查询。
所有 JSON.stringify 会返回 undefined 的值(顶层 undefined、数组元素 undefined、
函数、symbol)都必须显式编码,否则会被拼成裸 undefined 或被 Array.join 吞成空串
([undefined] 与 [] 因此曾得到同一个 key)。这里选择「唯一编码」而非「拒绝」:
指纹路径跑在用户实体实例上,类字段形式的箭头函数是自有属性,抛错会打断线上查询。
函数按源码、symbol 按 description 编码,都是尽力而为 —— 同源码的两个闭包仍然同 key, 但它们本来也无法作为查询条件区分。
对象里值为 undefined 的键仍然被跳过({a: undefined} ≡ {}),这与 JSON 语义
一致,也正是 {limit: undefined} 该等于 {} 的原因。