一、Object 静态方法
1. 对象操作
方法 | 功能描述 | 示例 |
---|
Object.keys(obj) | 返回对象自身可枚举属性组成的数组 | Object.keys({a:1, b:2}) → ["a", "b"] |
Object.values(obj) | 返回对象自身可枚举属性值组成的数组 | Object.values({a:1, b:2}) → [1, 2] |
Object.entries(obj) | 返回对象自身可枚举键值对数组(格式为 [key, value] ) | Object.entries({a:1}) → [["a", 1]] |
Object.fromEntries(iterable) | 将键值对列表(如 Map 、二维数组)转换为对象(ES2019) | Object.fromEntries([['x', 10]]) → {x: 10} |
Object.assign(target, ...src) | 合并多个对象到目标对象(浅拷贝) | Object.assign({a:1}, {b:2}) → {a:1, b:2} |
Object.create(proto) | 创建新对象,并指定原型链 | const obj = Object.create({baseProp: 'value'}) |
Object.defineProperty(obj, prop, descriptor) | 定义或修改对象属性(可配置特性如 writable 、enumerable ) | 见下方 属性描述符 部分 |
renameKeys | 重命名对象的key | |
2. 对象锁定
方法 | 功能描述 |
---|
Object.freeze(obj) | 冻结对象:禁止添加/删除/修改属性 |
Object.isFrozen(obj) | 判断一个对象是否被冻结 |
Object.seal(obj) | 密封对象:禁止添加/删除属性,允许修改现有属性 |
Object.isSealed(obj) | 判断一个对象是否可配置 |
Object.preventExtensions(obj) | 禁止对象添加新属性 |
Object.isExtensible(obj) | 判断对象是否可扩展 |
3. 属性描述符操作
const obj = {};
Object.defineProperty(obj, 'key', {
value: 42,
writable: false,
enumerable: true,
configurable: false
});
二、Object 实例方法
1. 常用方法
方法 | 功能描述 |
---|
obj.hasOwnProperty(prop) | 检查属性是否为对象自身属性(不包含原型链上的属性) |
obj.toString() | 返回对象的字符串表示(可重写) |
obj.valueOf() | 返回对象的原始值(常用于隐式类型转换) |
obj.propertyIsEnumerable(prop) | 判断属性是否可枚举 |
2. ES6+ 扩展
方法 | 功能描述 |
---|
Object.is(val1, val2) | 严格比较值(与 === 类似,但处理 NaN 和 ±0 不同)
Object.is(NaN, NaN) → true |
三、原型链相关方法
方法/属性 | 功能描述 |
---|
obj.__proto__ | 访问或设置对象的原型(不推荐直接操作,建议使用 Object.getPrototypeOf ) |
Object.getPrototypeOf(obj) | 获取对象的原型对象(推荐方式) |
Object.setPrototypeOf(obj, proto) | 设置对象的原型(性能敏感场景慎用) |
四、实用代码示例
1. 深拷贝对象
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
const obj = { a: [1, 2] };
const copy = deepCopy(obj);
2. 动态计算属性名(ES6)
const dynamicKey = 'age';
const person = {
name: 'Alice',
[dynamicKey]: 30
};
3. 合并对象并保留不可枚举属性
const obj = Object.create({}, {
hidden: { value: 'secret', enumerable: false },
visible: { value: 'public', enumerable: true }
});
const merged = Object.assign({}, obj);
五、注意事项
- 浅拷贝问题:
Object.assign()
和展开运算符 (...
) 仅执行浅拷贝 - 原型污染:避免直接修改
Object.prototype
,可能导致意外行为 - 性能优化:
Object.keys()
比 for...in
更快(不遍历原型链) - 属性顺序:ES6 规范定义了对象属性的遍历顺序(数字键升序 → 字符串键插入顺序 → Symbol键插入顺序)
掌握这些方法能显著提升对象操作能力,建议结合 TypeScript 类型系统增强代码健壮性。