Object 相关属性方法

一、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)定义或修改对象属性(可配置特性如 writableenumerable见下方 属性描述符 部分
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,   // 是否可枚举(出现在 for-in 循环中)
  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 // 属性名由变量决定 → {name: 'Alice', age: 30}
};
3. 合并对象并保留不可枚举属性
const obj = Object.create({}, {
  hidden: { value: 'secret', enumerable: false },
  visible: { value: 'public', enumerable: true }
});
const merged = Object.assign({}, obj); // 只合并可枚举属性 → {visible: 'public'}

五、注意事项

  1. 浅拷贝问题Object.assign() 和展开运算符 (...) 仅执行浅拷贝
  2. 原型污染:避免直接修改 Object.prototype,可能导致意外行为
  3. 性能优化Object.keys()for...in 更快(不遍历原型链)
  4. 属性顺序:ES6 规范定义了对象属性的遍历顺序(数字键升序 → 字符串键插入顺序 → Symbol键插入顺序)

掌握这些方法能显著提升对象操作能力,建议结合 TypeScript 类型系统增强代码健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值