在 JavaScript 中,Symbol 是一种新的数据类型,它可以用来创建唯一的属性名,避免属性名冲突。Symbol 是 ES6 引入的,但在 ES10 中也新增了一些 Symbol 相关的方法,为我们开发带来了更多的便利。
什么是 Symbol
Symbol 是一种新的数据类型,它是 ES6 新引入的。Symbol 类型的数据是唯一且不可变的,我们可以用它来创建对象的私有属性。它的语法如下:
let s = Symbol(描述信息);
其中描述信息不是必需的,它只是用于在调试时更好地识别 Symbol。
我们可以通过 Symbol() 方法来创建一个全局唯一的 Symbol,两个 Symbol 永远不会相等。
let s1 = Symbol(); let s2 = Symbol(); console.log(s1 === s2); // false
Symbol 在创建时还可以接收一个字符串作为参数,这个字符串是 Symbol 的描述信息。
let s1 = Symbol("foo"); let s2 = Symbol("foo"); console.log(s1 === s2); // false
Symbol 的应用
- Symbol 作为对象的属性名
在 JavaScript 中,对象的属性名必须是字符串类型,但是有了 Symbol,我们就可以使用 Symbol 作为属性名。
let obj = { [Symbol("foo")]: "foo", [Symbol("bar")]: "bar" }; console.log(obj[Symbol("foo")]); // undefined console.log(obj[Symbol("bar")]); // undefined
- Symbol.for()
Symbol.for("*") 会在全局中创建一个 Symbol 类型的值,如果以相同的参数调用 Symbol.for(),则会返回相同的 Symbol 值。这一点与 Symbol() 不同,Symbol() 每次调用都会创建一个新的 Symbol 值。
let s1 = Symbol.for("foo"); let s2 = Symbol.for("foo"); console.log(s1 === s2); // true
可以在全局对象 Symbol 中查看 Symbol.for() 创建的 Symbol。
console.log(Symbol.for("foo")); // Symbol(foo)
- Symbol.keyFor()
Symbol.keyFor() 方法返回一个已经被全局注册的 Symbol 对应的字符串。
let s1 = Symbol.for("foo"); console.log(Symbol.keyFor(s1)); // "foo"
- Symbol.iterator()
Symbol.iterator 用于定义对象的默认迭代器方法。可以使用 for...of 循环遍历这个对象。
let arr = [1, 2, 3]; let iterator = arr[Symbol.iterator](); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }
- Symbol.species
Symbol.species 用于创建 derived 类的实例。
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - --- - - --- ---------- -- --- --- - - ------- -- - - --- ------------- ---------- --------- -- ----- ------------- ---------- ------- -- ----
总结
Symbol 是一种新类型,它可以用于创建唯一的属性名,避免属性名冲突。ES10 新增了 Symbol 相关的方法,为我们开发带来了更多的便利。
对于前端开发人员来说,掌握 Symbol 相关的方法可以帮助我们更好地开发应用程序。我们可以使用 Symbol 来创建对象的私有属性,避免命名冲突等问题。同时 Symbol.for() 和 Symbol.keyFor() 可以在全局中创建和查找 Symbol。Symbol.iterator() 则可以定义对象的默认迭代器方法,方便我们进行遍历。其他方法 Symbol.species 则可以用于创建 derived 类的实例。
希望本文能够帮助读者更好地掌握 Symbol 相关的方法,并在开发过程中得到应用和指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64587e88968c7c53b0add430