Learn JavaScript

Object.isFrozen() - метод для проверки замороженного объекта в JavaScript

Object.isFrozen() проверяет, заморожен ли объект.

Сам метод ничего не изменяет. Он только отвечает на вопрос: находится ли объект в состоянии freeze.

Синтаксис

Object.isFrozen(obj)

obj - объект, состояние которого нужно проверить.

Что делает Object.isFrozen()

Если объект заморожен, метод вернёт true.

const user = { name: "Anna" };

Object.freeze(user);

console.log(Object.isFrozen(user)); // true

Если объект не заморожен, результат будет false.

const user = { name: "Anna" };

console.log(Object.isFrozen(user)); // false

Что возвращает Object.isFrozen()

Object.isFrozen() всегда возвращает булево значение:

  • true, если объект заморожен
  • false, если нет
const user = { name: "Anna" };

console.log(Object.isFrozen(user)); // false

Object.freeze(user);

console.log(Object.isFrozen(user)); // true

Что значит “объект заморожен”

Для замороженного объекта нельзя:

  • добавлять новые свойства
  • удалять существующие свойства
  • менять значения существующих свойств
  • перенастраивать свойства

Именно это состояние и проверяет Object.isFrozen().

Object.isFrozen() и Object.freeze()

Эти методы связаны напрямую:

  • Object.freeze() переводит объект в замороженное состояние
  • Object.isFrozen() проверяет, находится ли объект в этом состоянии
const config = { version: 1 };

console.log(Object.isFrozen(config)); // false

Object.freeze(config);

console.log(Object.isFrozen(config)); // true

Object.isFrozen() ничего не замораживает

Это важный момент.

const user = { name: "Anna" };

Object.isFrozen(user);

user.name = "Ivan";

console.log(user.name); // "Ivan"

Вызов Object.isFrozen() сам по себе ничего не меняет.

Заморозка работает поверхностно

Как и Object.freeze(), проверка относится только к самому объекту, а не ко всей вложенной структуре.

const user = {
  name: "Anna",
  address: {
    city: "Moscow",
  },
};

Object.freeze(user);

console.log(Object.isFrozen(user));         // true
console.log(Object.isFrozen(user.address)); // false

Верхний объект заморожен, но вложенный address остался обычным.

Массивы и Object.isFrozen()

Массив тоже является объектом, поэтому метод работает и с ним.

const numbers = [1, 2, 3];

console.log(Object.isFrozen(numbers)); // false

Object.freeze(numbers);

console.log(Object.isFrozen(numbers)); // true

Это удобно, если нужно проверить, можно ли ещё менять массив.

Object.isFrozen() и Object.isSealed()

Эти методы похожи, но проверяют разное состояние.

const user = { name: "Anna" };

Object.seal(user);

console.log(Object.isSealed(user)); // true
console.log(Object.isFrozen(user)); // false

seal() и freeze() - не одно и то же.

Замороженный объект строже, чем просто запечатанный.

Object.isFrozen() и Object.isExtensible()

Если объект заморожен, расширять его уже нельзя.

const user = { name: "Anna" };

Object.freeze(user);

console.log(Object.isFrozen(user));     // true
console.log(Object.isExtensible(user)); // false

Но одного isExtensible() === false ещё недостаточно, чтобы объект считался замороженным.

Не только после Object.freeze()

Обычно замороженное состояние получают через Object.freeze(), но технически объект может прийти к нему и другим путём.

Например, если:

  • объект уже нельзя расширять
  • все его свойства неконфигурируемые
  • все его свойства со значениями ещё и незаписываемые

Для обычной практики достаточно помнить: чаще всего true здесь появляется после Object.freeze().

Когда это полезно

Object.isFrozen() удобно использовать, когда:

  • нужно проверить, защищён ли объект от изменений
  • вы работаете с конфигами, константами или замороженными структурами
  • нужно явно убедиться, что Object.freeze() уже был применён

Пример:

const settings = Object.freeze({
  theme: "dark",
});

if (Object.isFrozen(settings)) {
  console.log("Настройки заморожены");
}

Object.isFrozen() не меняет объект

Метод только возвращает результат проверки.

const user = { name: "Anna" };
const result = Object.isFrozen(user);

console.log(result); // false
console.log(user);   // { name: "Anna" }

Частые ошибки

Думать, что Object.isFrozen() сам замораживает объект

const user = { name: "Anna" };

Object.isFrozen(user);

user.name = "Ivan";

console.log(user.name); // "Ivan"

Метод только проверяет состояние.

Считать, что если верхний объект frozen, то вложенные тоже frozen

const user = {
  profile: { city: "Moscow" },
};

Object.freeze(user);

console.log(Object.isFrozen(user));         // true
console.log(Object.isFrozen(user.profile)); // false

Заморозка по умолчанию не глубокая.

Путать Object.isFrozen() и Object.isSealed()

const user = { name: "Anna" };

Object.seal(user);

console.log(Object.isFrozen(user)); // false

Запечатанный объект ещё не обязательно заморожен.

Быстрая памятка

  • Object.isFrozen() проверяет, заморожен ли объект
  • метод возвращает true или false
  • сам объект метод не изменяет
  • проверка работает только для самого объекта, а не для вложенных объектов
  • обычно true появляется после Object.freeze()

Коротко

Object.isFrozen() - это способ проверить, находится ли объект в замороженном состоянии. Главное, что стоит запомнить: метод ничего не меняет сам, а только подтверждает, что объект уже защищён от изменений на верхнем уровне.