🐘 Symbol的一些应用场景

241 阅读1分钟

写在前面

Symbol是JavaScript中一种基本数据类型,于ES6引入,用于表示唯一的标识符。 本文只探讨一些Symbol的应用场景,想要了解Symbol基础知识的,推荐阅读[阮一峰的ES6入门](Symbol - ECMAScript 6入门 (ruanyifeng.com))

应用场景

(1)创建私有属性

使用Symbol作为对象的属性名可以防止属性被意外覆盖或者访问,从而实现私有属性的效果。以下代码中的Symbol属性就是私有属性,不能通过对象实例直接访问

const _name = Symbol('name');

class Person {
  constructor(name) {
    this[_name] = name;
  }
  getName() {
    return this[_name];
  }
}

const person = new Person('Tom');
console.log(person.getName()); // Tom
console.log(person._name); // undefined

(2)创建唯一的对象键名

使用Symbol作为对象的属性名可以避免属性名冲突的问题,因为每个Symbol都是唯一的。

const obj = {};
const symbol1 = Symbol('symbol1');
const symbol2 = Symbol('symbol2');

obj[symbol1] = 'value1';
obj[symbol2] = 'value2';

console.log(obj[symbol1]); // value1
console.log(obj[symbol2]); // value2

(3)实现对象的迭代器

以下代码中的Symbol.iterator定义了一个数组对象的迭代器,可以使用for...of循环进行遍历。

const arr = [1, 2, 3];

arr[Symbol.iterator] = function () {
  let index = 0;
  return {
    next: () => ({
      done: index >= arr.length,
      value: arr[index++],
    }),
  };
};

for (const value of arr) {
  console.log(value);
}