📜  ES6-符号(1)

📅  最后修改于: 2023-12-03 15:00:37.364000             🧑  作者: Mango

ES6-符号

ES6(也称为ES2015)是ECMAScript的第6个版本,在其新版本中增加了很多有用的功能。ES6中的符号是其中一个不可变的基元类型,用于作为来自应用程序以及库中的私有标识符。本文将介绍符号的用法及示例。

符号是什么?

符号是JS中的新原语类型,用于创建唯一标识符。符号可以用作对象属性的键,用于替代在ES5中使用字符串或数字作为键的方式。符号键具有以下特征:

  • 符号的值是唯一的,确保不同符号的键永远不会冲突。
  • 符号键是不可枚举的,不会出现在for-in或Object.keys()循环中。
  • 符号键是私有的,对于对象的属性访问需要使用Symbol.for()或Symbol()来访问。

下面是一个使用Symbol()创建的基本示例:

const sym = Symbol();
const obj = {};
obj[sym] = 'Hello, World!';
console.log(obj[sym]); // 输出'Hello, World!'

示例中使用Symbol()创建了一个唯一的符号,并将其用作对象键。通过返回存储在符号键下的值,可以从对象中访问该值。

创建全局符号

除了创建本地符号之外,您还可以使用Symbol.for()方法创建全局符号。全局符号具有全局性质,可以在应用程序中访问符号的字符串作为全局键。下面是一个示例:

// 在全局符号注册表中创建一个符号
const sym = Symbol.for('myKey');

// 获取全局键并输出
console.log(Symbol.keyFor(sym)); // 输出'myKey'

// 从另一个作用域获取全局键
const sym2 = Symbol.for('myKey');
console.log(sym === sym2); // true

上面的示例中,Symbol.for()方法用于创建一个全局符号,将使用给定的键字符串来注册该符号。使用Symbol.keyFor()方法可以检索全局符号的键。在其他作用域中调用Symbol.for()方法并传递相同的键字符串将返回相同的符号。

内置符号

ES6引入了许多内置符号,可以用于自定义对象行为。这些符号是内置的,可以通过Symbol.xxx语法进行访问。下面是一些常用的内置符号:

  • Symbol.iterator:用于定义一个对象的默认迭代器。
  • Symbol.toStringTag:用于更改对象的默认类型标记字符串。
  • Symbol.hasInstance:用于检查特定类型的对象是否是这个对象的实例。

以下是一个使用Symbol.iterator的示例:

// 创建一个简单的迭代器对象
const iterator = {
  [Symbol.iterator]() {
    let i = 0;
    return {
      next() {
        const value = i > 5 ? undefined : i++;
        const done = value === undefined;
        return { value, done };
      }
    };
  }
};

// 使用迭代器并输出所有值
for (const value of iterator) {
  console.log(value); // 0, 1, 2, 3, 4, 5
}

在上面的示例中,创建了一个简单的迭代器对象,并通过为[Symbol.iterator]属性定义方法来定义对象的默认迭代器。通过在for-of循环中遍历迭代器,可以输出所有可枚举的值。

结论

ES6中的符号是非常有用的功能,可用于创建私有标识符并更改默认对象行为。无论是在Web应用程序还是在Node.js中,符号都可以帮助您创建更安全和可扩展的应用程序。阅读本文后,您应该对符号的创建和使用有了更深入的了解。