在 JavaScript 中,Symbol 是一种基本数据类型,是一种特殊的、不可变的值。在 ES6 中,引入了这个新的数据类型,而在 ES8 中,其语法和用法都得到了进一步改进和完善,让 Symbol 变得更加强大和实用。
Symbol 的作用
Symbol 主要用于解决以下两个问题:
- 属性名冲突
在 JavaScript 中,对象的属性名都是字符串类型,当多个对象拥有同一个属性名时,很容易出现属性名冲突的问题。而使用 Symbol 作为属性名,可以有效地解决这个问题。
- 扩展对象的功能
Symbol 可以作为对象的属性名,同时也可以在原型链上使用。通过使用 Symbol,我们可以创建一些特殊的属性,从而扩展对象的功能。
Symbol 的基本用法
在 JavaScript 中,可以使用 Symbol 函数来创建一个新的 Symbol,如下所示:
const s = Symbol();
上面的代码将创建一个新的 Symbol,它的值是唯一的,无法与其它值相等。
Symbol 还可以接受一个字符串作为参数,用于在调试时标识该 Symbol,如下所示:
const s = Symbol('description');
同时,Symbol 也可以用作对象的属性名,比如:
const obj = { [Symbol('name')]: 'Tom', [Symbol('age')]: 18 }
Symbol 的高级用法
除了上面的基本用法外,Symbol 还可以配合其它功能一起使用,帮助我们实现一些更加复杂的场景。
Symbol.for 和 Symbol.keyFor
Symbol.for() 方法可以用来创建全局 Symbol,它会根据传入的字符串参数,判断全局中是否已经存在该 Symbol,如果存在,则返回该 Symbol 的引用,否则会创建一个新的 Symbol。
const s1 = Symbol.for('foo'); const s2 = Symbol.for('foo'); s1 === s2; // true
Symbol.keyFor() 方法可以用来获取已经存在的全局 Symbol 的键名。
const s1 = Symbol.for('foo'); const key = Symbol.keyFor(s1); console.log(key); // 'foo'
Symbol.iterator
Symbol.iterator 属性是一个用于指定对象默认迭代器的属性,它是一个函数,返回的对象必须具有 next() 方法,用于逐个访问每个属性。比如,可以使用 Symbol.iterator 实现一个简单的迭代器:
-- -------------------- ---- ------- ----- ---------- - -- --------------------------- - --------- -- - ----- -- ----- -- ----- -- -- --- ---- ----- -- ----------- - ------------------- - -- - -- - -- -
Symbol.species
Symbol.species 属性是一个函数,用于指定衍生对象的构造函数。比如,可以使用 Symbol.species 实现一个简单的衍生对象:
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- - - --- ---------- -- --- ----- - - ------- -- - - --- ------------- ---------- --------- -- ----- ------------- ---------- ------- -- ----
Symbol.toPrimitive
Symbol.toPrimitive 属性是一个函数,用于指定对象转换为原始类型时的行为。比如,可以使用 Symbol.toPrimitive 实现一个简单的对象加法:
-- -------------------- ---- ------- ----- --- - - --------- - ------ -- -- -------------------------- - -- ----- --- --------- -- ---- --- --------- - ------ -- - ------ ---- - -- --------------- - --- -- - --------------- - --- -- - ---------------------- -- ---
总结
Symbol 是一个非常强大和实用的 JavaScript 数据类型,它可以帮助我们解决很多对象属性名冲突和扩展对象功能的问题。除了基本用法外,Symbol 还有很多高级用法,可以配合其它功能一起使用,帮助我们实现一些更加复杂的场景。希望读者通过本文,对 Symbol 的概念和使用有更加深入的了解。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647196dc968c7c53b0f75e1c