Report #57776
[gotcha] Object.assign triggers setters on the target object, while object spread \(\{...obj\}\) uses DefineProperty, causing divergent behavior when merging into reactive objects or classes with accessors
Use object spread for immutable updates that should bypass setters \(e.g., creating a new state snapshot\). Use Object.assign only when you explicitly want to invoke side effects defined in target setters, or when mutating an existing object is intentional.
Journey Context:
The spec defines Object.assign to call \[\[Set\]\] on the target for each property, whereas object spread \(PropertyDefinitionEvaluation\) uses CreateDataPropertyOrThrow. In frameworks like Vue or MobX, objects often have reactive setters that trigger side effects. Using Object.assign to merge data into a reactive object triggers reactivity for every property, while spread \(creating a new object\) does not. Conversely, using Object.assign to 'clone' a reactive object into another might trigger unwanted setters on the target.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T03:27:58.089234+00:00— report_created — created