Deep Freeze With Cycle Protection
Recursively freeze arrays and objects while tolerating cycles, accessors and typed arrays that cannot be frozen with elements.
Code
export function deepFreeze(value, seen = new WeakSet()) {
if (value === null || (typeof value !== "object" && typeof value !== "function")) {
return value;
}
if (seen.has(value)) return value;
seen.add(value);
if (ArrayBuffer.isView(value)) return value;
for (const key of Reflect.ownKeys(value)) {
const descriptor = Object.getOwnPropertyDescriptor(value, key);
if (descriptor && "value" in descriptor) {
deepFreeze(descriptor.value, seen);
}
}
return Object.freeze(value);
}Report a problem with this exampleOpens a pre-filled issue on GitHub.