跳到主要内容

deterministicStringify()

function deterministicStringify(val): string;

Defined in: packages/rxdb/src/rxdb-utils.ts:223

确定性的 JSON.stringify

通过对 object 的键进行排序,确保相同内容但具有不同键顺序的对象能够生成相同的缓存 Key。

Parameters​

ParameterType
valunknown

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} 该等于 {} 的原因。