Hint
freeze = truly immutable; seal = no add/delete but values can change
Both prevent structural changes but differ in degree:
// freeze
const config = Object.freeze({ host: 'localhost', port: 3000 });
config.port = 9999; // silently fails (TypeError in strict)
config.debug = true; // silently fails
delete config.host; // false
console.log(config.port); // 3000 — unchanged
// seal
const sealed = Object.seal({ x: 1, y: 2 });
sealed.x = 99; // ✅ allowed — value change is OK
sealed.z = 3; // ❌ silently fails — no new props
delete sealed.x; // ❌ fails — no delete
// Critical gotcha: BOTH are SHALLOW
const frozen = Object.freeze({ nested: { a: 1 } });
frozen.nested.a = 99; // ⚠️ WORKS — nested object is not frozen!
// Deep freeze (recursive)
function deepFreeze(obj) {
Object.getOwnPropertyNames(obj).forEach(name => {
if (typeof obj[name] === 'object' && obj[name] !== null) {
deepFreeze(obj[name]);
}
});
return Object.freeze(obj);
}