在 ECMAScript 2015 中,引入了 Symbol 类型,它是一种新的基本数据类型,用于表示唯一的标识符。在 ECMAScript 2016 中,新增了 Symbol.for() 方法,它可以创建可共享的 Symbol,可以在不同的代码段之间共享同一个 Symbol,从而实现全局的唯一标识符。本文将介绍 Symbol.for() 方法的使用及常见错误。
Symbol.for() 方法的使用
Symbol.for() 方法接收一个字符串作为参数,如果已经存在相同字符串作为名称的 Symbol,则返回那个 Symbol,否则创建一个新的 Symbol。例如:
const symbol1 = Symbol.for('foo'); const symbol2 = Symbol.for('foo'); console.log(symbol1 === symbol2); // true
在上面的代码中,我们创建了两个名称相同的 Symbol,使用 === 运算符比较它们的值,得到的结果为 true,说明它们是同一个 Symbol。
Symbol.for() 方法创建的 Symbol 是全局可见的,可以在不同的代码段中共享。例如:
// file1.js const symbol1 = Symbol.for('foo'); console.log(symbol1); // file2.js const symbol2 = Symbol.for('foo'); console.log(symbol2);
在上面的代码中,我们在两个不同的文件中分别创建了名称相同的 Symbol,使用 console.log() 输出它们的值,得到的结果是相同的,说明它们是同一个 Symbol。
常见错误
在使用 Symbol.for() 方法时,有一些常见的错误需要注意。
错误一:参数必须是字符串类型
Symbol.for() 方法的参数必须是字符串类型,如果传入的是其他类型的值,则会抛出 TypeError 异常。例如:
const symbol = Symbol.for(123); // TypeError: Cannot convert a Symbol value to a string
在上面的代码中,我们尝试使用一个数字作为参数来创建 Symbol,由于参数不是字符串类型,会抛出 TypeError 异常。
错误二:Symbol.for() 方法不能创建私有 Symbol
Symbol.for() 方法创建的 Symbol 是全局可见的,可以在不同的代码段中共享。如果需要创建私有的 Symbol,应该使用 Symbol() 方法。例如:
const symbol1 = Symbol('foo'); const symbol2 = Symbol('foo'); console.log(symbol1 === symbol2); // false
在上面的代码中,我们使用 Symbol() 方法创建了两个名称相同的 Symbol,使用 === 运算符比较它们的值,得到的结果为 false,说明它们是不同的 Symbol。
错误三:Symbol.for() 方法不能创建 Symbol.proto
Symbol.proto 是 Object.prototype 的一个属性,它不能被覆盖或重写。如果尝试使用 Symbol.for() 方法来创建 Symbol.proto,会抛出 TypeError 异常。例如:
const symbol = Symbol.for('Symbol.proto'); // TypeError: Cannot create a Symbol with the key 'Symbol.proto'
在上面的代码中,我们尝试使用 Symbol.for() 方法来创建 Symbol.proto,由于它是 Object.prototype 的属性,会抛出 TypeError 异常。
总结
Symbol.for() 方法可以创建可共享的 Symbol,可以在不同的代码段之间共享同一个 Symbol,从而实现全局的唯一标识符。在使用 Symbol.for() 方法时,需要注意参数必须是字符串类型,Symbol.for() 方法不能创建私有 Symbol,以及不能创建 Symbol.proto。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650bb14795b1f8cacd5c5871