介绍
Symbol 是 ES6 中引入的一种新的基本数据类型,它可以用来创建一个唯一的标识符,可以用于对象的属性名、私有属性、构造函数等等。Symbol 的出现解决了对象属性名冲突的问题,使代码更加健壮和可维护。
实现
Symbol 的实现非常简单,可以使用 Symbol() 函数来创建一个 Symbol 类型的值。每个 Symbol 值都是唯一的,即使是相同的参数也不会相等。
const symbol1 = Symbol(); const symbol2 = Symbol(); console.log(symbol1 === symbol2); // false
Symbol 可以接受一个可选的描述字符串,用于在调试时区分不同的 Symbol 值。
const symbol1 = Symbol('foo'); const symbol2 = Symbol('foo'); console.log(symbol1 === symbol2); // false
使用
作为属性名
Symbol 值可以作为对象的属性名,这样可以避免属性名冲突的问题。
const obj = { [Symbol('foo')]: 'bar' }; console.log(obj); // {Symbol(foo): "bar"} console.log(obj[Symbol('foo')]); // "bar"
私有属性
使用 Symbol 可以模拟实现私有属性。
// javascriptcn.com 代码示例 const _name = Symbol('name'); class Person { constructor(name) { this[_name] = name; } getName() { return this[_name]; } } const person = new Person('Tom'); console.log(person.getName()); // Tom console.log(person._name); // undefined
遍历
Symbol 属性不会出现在 for...in、Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 等方法中,但是可以使用 Object.getOwnPropertySymbols() 方法来获取对象的所有 Symbol 属性。
const obj = { [Symbol('foo')]: 'bar', [Symbol('baz')]: 'qux' }; console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(foo), Symbol(baz)]
其他用途
Symbol 还有一些其他的用途,比如可以用于实现迭代器、实现自定义的对象类型等等。
总结
Symbol 是 ES6 中引入的一种新的基本数据类型,它可以用来创建一个唯一的标识符,可以用于对象的属性名、私有属性、构造函数等等。Symbol 的出现解决了对象属性名冲突的问题,使代码更加健壮和可维护。在实际开发中,我们可以使用 Symbol 来创建私有属性、避免属性名冲突等等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6506a93695b1f8cacd267905