返回

一探“对象可枚举性”的深层奥义

前端

在JavaScript中,对象遍历是操作对象数据的一种常见方式。在遍历过程中,可枚举性是一个重要的概念,它决定了对象的哪些属性和方法会被枚举到。Symbol是一种特殊的内置对象,它可以用来创建不可枚举的属性和方法,从而避免在枚举对象时被访问到。

可枚举性

可枚举性是JavaScript对象的一个属性,它决定了对象的属性和方法是否会被枚举到。通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for...in或Object.keys等方法)。而使用Symbol创建的属性和方法是不可枚举的,不会被枚举到。

const object = {
  name: "John Doe",
  age: 30,
  [Symbol("salary")]: 50000,
};

for (const property in object) {
  console.log(property); // "name" and "age"
}

console.log(Object.keys(object)); // ["name", "age"]

console.log(Reflect.ownKeys(object)); // ["name", "age", Symbol("salary")]

在上面的代码中,object对象有两个普通属性name和age,还有一个使用Symbol创建的不可枚举属性salary。使用for...in、Object.keys和Reflect.ownKeys等方法遍历对象时,只有可枚举的属性和方法会被枚举到。

Symbol

Symbol是一种特殊的内置对象,它可以用来创建不可枚举的属性和方法。Symbol的语法如下:

const symbol = Symbol();

Symbol()函数接收一个可选的字符串参数,这个字符串参数可以作为Symbol的。

const symbol = Symbol("salary");

使用Symbol创建的属性和方法是不可枚举的,不会被枚举到。

const object = {
  name: "John Doe",
  age: 30,
  [Symbol("salary")]: 50000,
};

for (const property in object) {
  console.log(property); // "name" and "age"
}

console.log(Object.keys(object)); // ["name", "age"]

console.log(Reflect.ownKeys(object)); // ["name", "age", Symbol("salary")]

在上面的代码中,object对象有两个普通属性name和age,还有一个使用Symbol("salary")创建的不可枚举属性salary。使用for...in、Object.keys和Reflect.ownKeys等方法遍历对象时,只有可枚举的属性和方法会被枚举到。

总结

可枚举性是JavaScript对象的一个重要属性,它决定了对象的哪些属性和方法会被枚举到。Symbol是一种特殊的内置对象,它可以用来创建不可枚举的属性和方法,从而避免在枚举对象时被访问到。