ES6 中的 Symbol 类型及其常用方法

ES6 中引入了一个新的原始数据类型 Symbol,它是一种基本数据类型,类似于Number、String、Boolean等类型。每个Symbol类型的值都是唯一的,这是它的最大特点。

Symbol 的基本用法

在 ES6 中,我们可以通过Symbol函数来创建一个Symbol类型的值。

let id = Symbol();
console.log(typeof id);  // "symbol"

Symbol函数可以接受一个可选的字符串参数,用来描述这个Symbol类型的值。

let id = Symbol("id");
console.log(id);  // Symbol(id)

我们可以给Symbol类型的值取一个名称,但不影响其唯一性。

Symbol 的特点

Symbol类型的值有如下的特点:

  • 一个Symbol类型的值永远不会等于另一个Symbol类型的值;
  • Symbol类型的值可以作为对象的属性名使用,但不能使用点运算符;
  • Symbol类型的值无法显示转换为字符串;
  • Symbol类型的值也无法通过JSON.stringify()序列化;

Symbol 对象方法

ES6 中,Symbol构造函数有一些方法能返回Symbol值的相关信息。

Symbol.for()

Symbol.for()是一个注册表,它接受一个字符串作为参数,并返回一个Symbol类型的值。当你使用相同的字符串调用时,它会返回相同的Symbol值。

let id1 = Symbol.for("id");
let id2 = Symbol.for("id");

console.log(id1 === id2);  // true

Symbol.keyFor()

Symbol.keyFor()方法和Symbol.for()方法相反,它接受一个Symbol类型的值,并返回注册表中与该值关联的字符串。

let id = Symbol.for("id");
let key = Symbol.keyFor(id);

console.log(key);  // "id"

Symbol 作为对象属性名

Symbol类型的值可以用作对象属性名,这种用法是其最重要的应用场景之一。

let id = Symbol();

let person = {
  [id]: 123
};

console.log(person[id]);  // 123

由于Symbol类型的值的唯一性,它可以很好地解决属性名重复的问题。

Symbol 暴露的类型

ES6中有一些内置的Symbol类型,可以用来访问某些实例的内部属性,如:Symbol.iterator。

Symbol.iterator

Symbol.iterator用来指示对象是可迭代的,可以使用for...of循环结构进行遍历。

let arr = [10, 20, 30];
let iterator = arr[Symbol.iterator]();

console.log(iterator.next());  // {value: 10, done: false}
console.log(iterator.next());  // {value: 20, done: false}
console.log(iterator.next());  // {value: 30, done: false}
console.log(iterator.next());  // {value: undefined, done: true}

Symbol.match

Symbol.match用于对象指挥当前对象是否有匹配的方法,在使用正则表达式时非常有用。

let str = "hello world";
console.log(str.match(/world/));  // ["world", index: 6, input: "hello world", groups: undefined]

let obj = {
  [Symbol.match]: function(value) {
    return "hello world".indexOf(value) >= 0;
  }
};

console.log("world".match(obj));  // true

Symbol.toPrimitive

Symbol.toPrimitive方法用于对象指挥如何将其转换为原始值。

let obj = {
  [Symbol.toPrimitive]: function(hint) {
    switch (hint) {
      case "string":
        return "hello";
      case "number":
        return 123;
      case "default":
        return "default";
    }
  }
};

console.log(String(obj));  // "hello"
console.log(Number(obj));  // 123
console.log(obj + "");   // "default"

总结

本文主要介绍了ES6 中的Symbol类型及其常用方法,以及Symbol类型的使用场景。对于初学者来说,可以更好的理解JavaScript中的内存模型及其应用。同时,Symbol类型的应用场景也很广泛,能够为我们带来很多便利。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0ef47add4f0e0ff91c4ff


纠错反馈