ES6(四)Symbol

本文最后更新于:8 个月前

介绍基本类型 Symbol 的用途,使用示例,Symbol.for方法,和ES6内置的Symbol

ES6(四)Symbol

1. 简介

ES6引入了Symbol基本类型,它的特点是每一个Symbol都是独一无二的,这样可以避免重复key的出现。使用方式如下:

1
2
3
let s1 = Symbol('foo');
s1 // Symbol(foo)
s1.description // foo

以 Symbol 值作为键名,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。

2. 使用示例

作为属性值,写入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};

// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' })

// 以上三种写法的读取结果都是:
a[mySymbol] // 'Hello!'
a.mySymbol // undefined
a['mySymbol'] // undefined

注意,Symbol 值作为对象属性名时,不能用点运算符

1
2
3
4
5
6
7
8
9
10
// 此处对象a的属性实际上是一个字符串,而不是一个Symbol值
var mySymbol = Symbol();

// 第四种写法
a.mySymbol = 'Hello!'

// 读取
a.mySymbol // 'Hello!'
a[mySymbol] // undefined
a['mySymbol'] // 'Hello!'

3. Symbol.for 和 Symbol.keyFor

Symbol.for()方法支持使用同一个 Symbol 值,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。

1
2
Symbol.for("bar") === Symbol.for("bar")	// true
Symbol("bar") === Symbol("bar") // false

Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

4. 内置的Symbol

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。如Symbol.iterator(指向对象的默认遍历器方法)、Symbol.toStringTag(可以用来定制[object Object][object Array]object后面的那个字符)


ES6(四)Symbol
http://timegogo.top/2023/03/29/JavaScript/ES6(四)Symbol/
作者
丘智聪
发布于
2023年3月29日
更新于
2023年7月16日
许可协议