Signatur
Beschreibung
Object.isFrozen() gibt true zurück, wenn ein Objekt eingefroren ist. Das heißt: Es können keine neuen Eigenschaften hinzugefügt werden (nicht erweiterbar), alle eigenen Eigenschaften sind nicht konfigurierbar, und alle eigenen Dateneigenschaften sind zusätzlich nicht beschreibbar (writable: false). Accessor-Eigenschaften (Getter/Setter) gelten nur als nicht konfigurierbar; ihr Setter kann weiterhin aufgerufen werden.
Die Methode prüft den tatsächlichen Zustand und nicht, ob irgendwann Object.freeze() aufgerufen wurde. Ein leeres, nicht erweiterbares Objekt ist daher ebenfalls eingefroren, auch wenn Object.freeze() nie aufgerufen wurde. Ebenso kann man ein Objekt über Object.preventExtensions() und Object.defineProperty() von Hand „einfrieren“.
Typische Einsatzfälle sind Absicherungen in Bibliotheken (z. B. „dieser Zustand darf nicht verändert werden“), Tests für unveränderliche Datenstrukturen oder Debugging, wenn Zuweisungen scheinbar folgenlos bleiben. Beachte, dass die Prüfung flach ist: Verschachtelte Objekte werden nicht untersucht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $obj Pflicht | any | Der zu prüfende Wert. Seit ES2015 werden auch Primitive akzeptiert (sie gelten immer als eingefroren). |
Beispiele
Grundlegende Prüfung nach Object.freeze()
const config = { api: 'https://example.com', timeout: 5000 };
console.log(Object.isFrozen(config));
Object.freeze(config);
console.log(Object.isFrozen(config));
config.timeout = 1; // wird im Sloppy Mode still ignoriert
console.log(config.timeout);
Randfälle: leere Objekte, sealed und Primitive
// Leeres, nicht erweiterbares Objekt ist automatisch eingefroren
const leer = Object.preventExtensions({});
console.log(Object.isFrozen(leer));
// Versiegelt, aber Werte noch beschreibbar -> nicht eingefroren
const sealed = Object.seal({ a: 1 });
console.log(Object.isFrozen(sealed));
// Primitive gelten seit ES2015 als eingefroren
console.log(Object.isFrozen(42), Object.isFrozen('text'));
Flache Prüfung und rekursives isDeepFrozen
const state = Object.freeze({ user: { name: 'Ada' } });
console.log(Object.isFrozen(state)); // true
console.log(Object.isFrozen(state.user)); // false – verschachtelt!
const isDeepFrozen = (obj) =>
Object.isFrozen(obj) &&
Reflect.ownKeys(obj).every((key) => {
const value = obj[key];
return typeof value !== 'object' || value === null || isDeepFrozen(value);
});
console.log(isDeepFrozen(state));
Absicherung in einer Funktion
'use strict';
const updateSettings = (settings, patch) => {
if (Object.isFrozen(settings)) {
// Kopie statt Mutation erzeugen
return { ...settings, ...patch };
}
return Object.assign(settings, patch);
};
const defaults = Object.freeze({ theme: 'light' });
const result = updateSettings(defaults, { theme: 'dark' });
console.log(result.theme, defaults.theme);
// Wichtig · Fallstricke
- Nur flach:
Object.isFrozen()prüft nur die eigenen Eigenschaften der obersten Ebene. Verschachtelte Objekte und Arrays können trotzdem veränderbar sein. Für eine tiefe Prüfung musst du selbst rekursiv prüfen. - ES5 im Vergleich zu ES2015: In ES5 löste ein Nicht-Objekt als Argument einen
TypeErroraus. Seit ES2015 liefertObject.isFrozen(1)einfachtrue. - Accessor-Eigenschaften: Ein eingefrorenes Objekt kann Setter enthalten, die weiterhin internen (Closure-)Zustand ändern. „Eingefroren“ heißt also nicht automatisch „komplett unveränderlich“.
- Typed Arrays: Nicht leere
TypedArrays lassen sich nicht einfrieren (Object.freeze()wirft einenTypeError).Object.isFrozen()liefert bei ihnen daherfalse. - Zuweisungen an eingefrorene Objekte scheitern im Sloppy Mode still und werfen im Strict Mode einen
TypeError. - Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt (Baseline).