JS中对象的常用方法

1. 获取对象的属性

  • Object.keys(obj):返回一个包含对象所有可枚举属性的数组。
  • Object.values(obj):返回一个包含对象所有可枚举属性值的数组。
  • Object.entries(obj):返回一个给定对象自身可枚举属性的键值对数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // 输出: ['a', 'b', 'c']
console.log(Object.values(obj)); // 输出: [1, 2, 3]
console.log(Object.entries(obj)); // 输出: [['a', 1], ['b', 2], ['c', 3]]

2. 检查属性

  • hasOwnProperty(prop):判断对象是否具有指定的属性(不包括原型链上的属性)。
const obj = { a: 1, b: 2 };
console.log(obj.hasOwnProperty('a')); // 输出: true
console.log(obj.hasOwnProperty('toString')); // 输出: false

3. 属性描述符

  • Object.defineProperty(obj, prop, descriptor):定义新属性或修改现有属性,并返回该对象。
  • Object.defineProperties(obj, props):在一个对象上定义新的或修改现有属性,接受一个属性描述符的对象。
const obj = {};
Object.defineProperty(obj, 'name', {
    value: 'Alice',
    writable: true,
    enumerable: true,
    configurable: true
});
console.log(obj.name); // 输出: Alice

4. 防止扩展

  • Object.preventExtensions(obj):防止对象添加新属性,但仍可以删除现有属性。
  • Object.isExtensible(obj):判断对象是否可以添加新属性。
const obj = { a: 1 };
Object.preventExtensions(obj);
obj.b = 2; // 新属性不会被添加
console.log(obj.b); // 输出: undefined
console.log(Object.isExtensible(obj)); // 输出: false

5. 密封对象

  • Object.seal(obj):阻止其他代码删除已有属性,同时使现有属性不可配置,但允许它们的值进行更改。
  • Object.isSealed(obj):判断对象是否已被密封。
const obj = { a: 1 };
Object.seal(obj);
delete obj.a; // 删除失败
console.log(obj.a); // 输出: 1
console.log(Object.isSealed(obj)); // 输出: true

6. 冻结对象

  • Object.freeze(obj):冻结对象,使其无法添加、删除或修改任何属性(也不可配置)。
  • Object.isFrozen(obj):判断对象是否已被冻结。
const obj = { a: 1 };
Object.freeze(obj);
obj.a = 2; // 修改失败
console.log(obj.a); // 输出: 1
console.log(Object.isFrozen(obj)); // 输出: true

7. 对象继承与原型

  • Object.create(proto[, propertiesObject]):创建一个新对象,使用现有的对象作为新创建对象的原型。
  • Object.getPrototypeOf(obj):获取对象的原型。
  • Object.setPrototypeOf(obj, prototype):设置对象的原型(相对较少使用,因为它可能导致性能问题)。
const proto = { a: 1 };
const obj = Object.create(proto);
console.log(Object.getPrototypeOf(obj) === proto); // 输出: true

在 JavaScript 中,判断一个对象是否为空(即不包含任何自身可枚举属性)有几种方法。以下是几种常用的方法:

8. 判断对象是否为空

方法 1: 使用 Object.keys()

Object.keys() 方法返回一个由对象自身可枚举属性组成的数组。如果这个数组的长度为0,则表示对象是空的。

function isEmptyObject(obj) {
    return Object.keys(obj).length === 0;
}

console.log(isEmptyObject({})); // 输出: true
console.log(isEmptyObject({key: "value"})); // 输出: false
方法 2: 使用 for...in 循环

你可以使用 for...in 循环来遍历对象的属性,并检查是否有任何属性存在。如果循环体内的代码没有被执行,则说明对象是空的。

function isEmptyObject(obj) {
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            return false;
        }
    }
    return true;
}

console.log(isEmptyObject({})); // 输出: true
console.log(isEmptyObject({key: "value"})); // 输出: false

注意:这里我们使用了 hasOwnProperty() 来确保只考虑对象自身的属性,而忽略了原型链上的属性。

方法 3: 使用 JSON.stringify()

虽然这不是最有效的方式,但可以通过将对象转换为 JSON 字符串后检查结果是否为 "{}" 来判断对象是否为空。

function isEmptyObject(obj) {
    return JSON.stringify(obj) === '{}';
}

console.log(isEmptyObject({})); // 输出: true
console.log(isEmptyObject({key: "value"})); // 输出: false

不过,这种方法不如前两种方法直观或高效,而且它不能正确处理包含函数、undefined 值等非 JSON 安全类型的对象。

方法 4: 使用 Object.entries()

类似于 Object.keys(),你也可以使用 Object.entries() 来获取对象中所有的 [key, value] 对数组。如果该数组的长度为0,则对象为空。

function isEmptyObject(obj) {
    return Object.entries(obj).length === 0;
}

console.log(isEmptyObject({})); // 输出: true
console.log(isEmptyObject({key: "value"})); // 输出: false
方法 5: 使用Reflect.ownKeys()

Reflect.ownKeys() 返回一个由目标对象自身的所有属性的数组(包括不可枚举属性和符号类型键),这比 Object.keys() 更加全面,因为它不仅包括可枚举的自有属性,还包括不可枚举的自有属性以及符号类型的键。

function isEmptyObject(obj) {
    return Reflect.ownKeys(obj).length === 0;
}

console.log(isEmptyObject({})); // 输出: true
console.log(isEmptyObject({key: "value"})); // 输出: false

// 包含不可枚举属性的例子
const objWithNonEnumerable = Object.create({}, {
    key: { value: 'value', enumerable: false }
});
console.log(isEmptyObject(objWithNonEnumerable)); // 输出: false, 因为 Reflect.ownKeys 也检查不可枚举属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值