docs(tests): clarify validation ownership and digest lifecycle checks
This commit is contained in:
@@ -9,10 +9,12 @@ import {detachJsonData,hasDetachedJsonData} from '../../src/lib/canvas-core/json
|
||||
// 修改外部嵌套对象/日期不得影响结果;数组空洞等变null,特殊键保留,伪造冻结副本无证明,循环/BigInt明确抛错。
|
||||
test('JSON detachment owns only its copied immutable result and preserves JSON semantics',()=>{
|
||||
let calls=0;const external={nested:{text:'before'},date:new Date('2026-01-01Z'),custom:{toJSON(){calls++;return{value:2};}},array:[,undefined,NaN],['__proto__']:{safe:true}};
|
||||
// toJSON 应在隔离时只执行一次,随后修改原对象/Date 来检查结果与调用方引用是否脱离。
|
||||
const value=detachJsonData(external);assert.equal(calls,1);assert.equal(hasDetachedJsonData(value),true);assert.equal(hasDetachedJsonData(external),false);
|
||||
external.nested.text='after';external.date.setUTCFullYear(2027);
|
||||
assert.equal(value.nested.text,'before');assert.equal(value.date,'2026-01-01T00:00:00.000Z');assert.deepEqual(value.array,[null,null,null]);assert.equal(Object.hasOwn(value,'__proto__'),true);
|
||||
assert.ok(Object.isFrozen(value.nested));assert.throws(()=>{value.nested.text='mutate';},TypeError);
|
||||
// freeze 副本或 structuredClone 虽可保持相同内容,却不携带隔离函数私有的对象身份证明。
|
||||
assert.equal(hasDetachedJsonData(Object.freeze({...value})),false);assert.equal(hasDetachedJsonData(structuredClone(value)),false);
|
||||
assert.equal(hasDetachedJsonData(Object.freeze({nested:{mutable:true}})),false);
|
||||
const cycle={};cycle.self=cycle;assert.throws(()=>detachJsonData(cycle));assert.throws(()=>detachJsonData({big:1n}));
|
||||
|
||||
Reference in New Issue
Block a user