Skip to main content

Object.isFrozen()

语法

isFrozen(o: any): boolean;

描述

用于判断一个对象是否被冷冻.

  • 一个不可扩展的空对象同时也是一个冻结对象

  • 对于一个不可扩展且所有属性为不可配置的非空对象(其实也就是一个密封的对象)

    • 当属性不可写时,此对象为冻结对象
    • 当属性拥有访问器属性,此对象为冻结对象

示例

一个不可扩展的空对象同时也是一个冻结对象。

// 不可扩展的空对象是被冻结的
const nonExtensibleEmptyObj = Object.preventExtensions({});
Object.isFrozen(nonExtensibleEmptyObj); // true

// 不可扩展的非空对象不是被冻结的
const nonExtensibleObj = Object.preventExtensions({ name: 'yancey' });
Object.isFrozen(nonExtensibleObj); // false

当一个非空对象不可扩展且不可配置(实际就是被密封的),同时它的所有属性是不可写的或者有访问器属性,那么它是被冻结的。

// obj1是不可扩展的,且所有属性不可配置、不可写,所以它是被冷冻的
const obj1 = Object.defineProperty({}, 'name', {
value: 'yancey',
configurable: false,
writable: false,
});
Object.preventExtensions(obj1);
Object.isFrozen(obj1); // true

// obj2是不可扩展的,且所有属性不可配置,且有访问器属性,所以它是被冷冻的
const obj2 = Object.defineProperty({}, 'name', {
configurable: false,
get() {
return 'yancey';
},
});
Object.preventExtensions(obj2);
Object.isFrozen(obj2); // true

一个被密封的空对象是被冻结的。

// 密封的空对象是被冻结的
const sealedEmptyObj = Object.seal({});
Object.isFrozen(sealedEmptyObj); // true

// 密封的非空对象不是被冻结的
const sealedObj = Object.seal({ name: 'yancey' });
Object.isFrozen(sealedObj); // false

一个被密封的非空对象,同时它的所有属性是不可写的或者有访问器属性,那么它是被冻结的。

// obj1是密封的、且所有属性不可写,所以它是被冷冻的
const obj1 = Object.seal({
name: 'yancey',
});
Object.defineProperty(obj1, 'name', {
writable: false,
});
Object.isFrozen(obj1); // true

// obj2是密封的,且有访问器属性,所以它是被冷冻的
const obj2 = Object.defineProperty({}, 'name', {
get() {
return 'yancey';
},
});
Object.seal(obj2);
Object.isFrozen(obj2); // true

冻结对象一定是冻结的。

const frozen = Object.freeze({});
Object.isFrozen(frozen); // true

扩展

在 ES5 中,如果这个方法的参数不是一个对象(一个原始类型),那么它会导致 TypeError。在 ES6+ 中,非对象参数将被视为是一个冻结的普通对象,只返回 true.

// TypeError: 1 is not an object (ES5)
Object.isFrozen(1);

// ES6
Object.isFrozen(1); // true