在 ES9 中,引入了两个新的 Symbol 方法:Symbol.for 和 Symbol.keyFor。
Symbol.for 方法
Symbol.for 方法用于创建一个全局可访问的 Symbol。它接受一个字符串作为参数作为 Symbol 的标识符,如果该标识符已存在,则返回对应的 Symbol,否则创建一个新的 Symbol 并返回。
const symbol1 = Symbol.for('mySymbol'); // 创建一个全局的 Symbol const symbol2 = Symbol.for('mySymbol'); console.log(symbol1 === symbol2); // true
上述代码中,我们创建了一个名为 mySymbol 的全局 Symbol,并为它创建了两个引用。在第二次调用 Symbol.for 时,该方法会检查全局注册表是否已经存在了 mySymbol 标识符的 Symbol,如果存在,则返回该 Symbol,否则创建一个新的 Symbol 并将其添加到全局注册表中,并返回新创建的 Symbol。
Symbol.keyFor 方法
Symbol.keyFor 方法用于检索已经使用 Symbol.for 方法创建的 Symbol 的标识符。该方法接受一个 Symbol 作为参数,如果该 Symbol 被注册过,则返回其对应的标识符,否则返回 undefined。
const symbol1 = Symbol.for('mySymbol'); const symbol2 = Symbol('mySymbol'); console.log(Symbol.keyFor(symbol1)); // mySymbol console.log(Symbol.keyFor(symbol2)); // undefined
上述代码中,我们创建了两个 Symbol:一个使用 Symbol.for 方法创建,一个使用 Symbol 构造函数创建。然后我们使用 Symbol.keyFor 方法检索了这两个 Symbol 的标识符。
使用场景
Symbol.for 和 Symbol.keyFor 这两个方法在实际的前端开发中有着广泛的应用场景。
防止命名冲突
在开发大型的 Web 应用程序时,命名空间冲突是经常遇到的问题之一。使用 Symbol.for 可以轻松地为变量创建唯一的标识符,从而解决命名空间冲突的问题。
数据缓存
使用 Symbol.for 创建全局的 Symbol,可以方便地在多个模块之间共享数据。例如,我们可以使用 Symbol.for 来创建一个全局的数据缓存对象,存储应用程序的多个部分所共享的数据。
const cache = Symbol.for('cache'); const app = {}; if (!app[cache]) { app[cache] = {}; } // 在各个模块中使用 app[cache] 对象进行数据缓存
规定符号特定的行为
在 ECMAScript 中,一些内置对象(如 Array、String、Set)包含可迭代属性。如果希望定制这些内置对象的迭代行为,可以使用 Symbol 类型的属性名,并覆盖内置的行为。
例如,我们要为数组对象添加一个新的属性,该属性的值是一个可迭代对象,代表数组中每个元素的平方。
// javascriptcn.com 代码示例 const s = Symbol(); const myArray = [1, 2, 3]; myArray[s] = function* () { for (let i = 0; i < this.length; i++) { yield this[i] * this[i]; } } for (const n of myArray[s]()) { console.log(n); // 输出 1、4、9 }
上述代码中,我们创建了一个 Symbol 类型的属性名 s,然后在数组对象中添加该属性作为迭代器方法。最后,我们使用 for...of 循环遍历该迭代器并输出每个元素的平方。
总结
ES9 中的 Symbol.for 和 Symbol.keyFor 方法是很有用的。使用 Symbol.for 方法创建全局的 Symbol,可以解决命名空间冲突的问题,同时可以在多个模块之间共享数据。而使用 Symbol.keyFor 方法可以检索已经使用 Symbol.for 方法创建的 Symbol 的标识符。在实际开发中,开发者可以根据实际需要合理地运用这两个方法,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654d48917d4982a6eb6a8981