mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
73ab88e65b
Three small, behavior-neutral cleanups to maybeRemoveStaleArrayFields: 1. Avoid allocating an empty Set when prevData.byTrackingKey is undefined. new Set(undefined) previously created an unused empty Set on every call for parents with no tracking keys. 2. Guard the per-element tracking-key check on `oldTracking` being defined, skipping the isObject/hasOwn check entirely when there's nothing to track. 3. Replace childValue.hasOwnProperty(identitySymbol) with Object.hasOwn(childValue, identitySymbol). hasOwnProperty throws on null-prototype array elements (Object.create(null)), which would crash computeChildrenMap. Object.hasOwn is null-prototype-safe and preserves "own property" semantics (does not match inherited identitySymbol values). 4. Replace `data.byTrackingKey?.delete(id)` with `data.byTrackingKey!.delete(id)`. The optional chaining was dead: if oldTracking.size > 0, prevData.byTrackingKey (and therefore data.byTrackingKey, same Map reference via the spread) is always defined. The `?.` masked this invariant; `!` documents it and would surface a runtime error instead of a silent no-op if the invariant is ever violated. Verified via performance.mark/measure instrumented directly inside the function (count=1 call for a single-field edit in both cases). Total duration dropped from ~0.7ms to ~0.1ms, consistent with the avoided Set allocation in (1) and (2).