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