Object.isFrozen()用于检测对象是否被冻结,返回布尔值;要求对象不可扩展、所有自身属性不可配置、所有自身数据属性不可写,对非对象类型直接返回true。

JavaScript 中检测对象是否被冻结,使用的是 Object.isFrozen() 方法。它返回一个布尔值,表示该对象是否处于冻结状态(即不可扩展、所有属性不可配置、且所有数据属性不可写)。
isFrozen 的基本用法
调用方式很简单:
-
Object.isFrozen(obj)—— 参数为待检测的对象 - 返回
true表示对象已被冻结;false表示未被冻结(包括未定义、null、原始值、或部分/未完全冻结)
注意:对非对象类型(如字符串、数字、null、undefined)调用时,会直接返回 true(因为原始值本身不可变,被视为“冻结”)。
冻结对象需满足的三个条件
Object.isFrozen() 判定为 true,要求对象同时满足以下三点:
立即学习“Java免费学习笔记(深入)”;
- 对象不可扩展(
Object.isExtensible(obj) === false) - 对象所有自身属性都不可配置(
configurable: false) - 对象所有自身数据属性都不可写(
writable: false;访问器属性不受此限制,但必须不可配置)
例如:Object.freeze({a: 1}) 满足全部条件,Object.isFrozen() 返回 true;而仅设 Object.preventExtensions() 或仅用 Object.defineProperty 改写个别属性,则通常返回 false。
常见误判场景与注意事项
容易出错的地方包括:
- 只冻结了顶层对象,但嵌套对象未冻结 ——
Object.isFrozen()仍返回true(它不递归检查深层) - 给对象添加了 getter/setter 属性 —— 只要这些属性自身
configurable: false,不影响判定结果 - 检测数组时,冻结后无法增删元素、修改长度、更改已有项(如
arr[0] = 2失败),此时Object.isFrozen(arr)为true
若需深度冻结,需手动递归调用 Object.freeze();同理,深度检测冻结状态也需自行实现遍历逻辑。
与 isSealed、isExtensible 的关系
三者是递进关系:
-
Object.isExtensible()最宽松:只看能否添加新属性 -
Object.isSealed()更严:不可扩展 + 所有属性不可配置(但数据属性仍可写) -
Object.isFrozen()最严格:在 sealed 基础上,还要求所有数据属性不可写
因此:isFrozen(obj) === true ⇒ isSealed(obj) === true ⇒ isExtensible(obj) === false,但反向不成立。










