ES7 对于类型代表符号是什么?
随着 JavaScript 这门语言的发展,ES7(ECMAScript 2016)引入了一些新的特性,其中之一就是类型代表符号(Symbol)。
Symbol 是 JavaScript 中的一种基本数据类型,它可以用来创建一个独一无二的值,可以用作对象属性的键名,以防止属性名的冲突。Symbol 值是通过 Symbol 函数创建的,例如:
const symbol1 = Symbol(); const symbol2 = Symbol('symbol2');
上面的代码中,我们通过 Symbol 函数分别创建了两个 Symbol 值,symbol1 和 symbol2,其中 symbol2 的描述是可选的,用来描述该 Symbol 值的用途。
类型代表符号的一个重要应用是在对象中定义私有属性。在 JavaScript 中,对象的属性可以通过访问器(getter 和 setter)来进行读写,但是这样会暴露属性的实现细节,因此可以使用类型代表符号来隐藏属性。
例如,我们可以定义一个名为 Person 的类来表示一个人,其中包含一个私有属性 _name:
// javascriptcn.com 代码示例 const nameSymbol = Symbol('name'); class Person { constructor(name) { this[nameSymbol] = name; } get name() { return this[nameSymbol]; } set name(value) { this[nameSymbol] = value; } } const person = new Person('张三'); console.log(person.name); // "张三" person.name = '李四'; console.log(person.name); // "李四" console.log(person[nameSymbol]); // undefined
上面的代码中,我们使用类型代表符号来定义了私有属性 _name,通过访问器来读写该属性的值,外部无法直接访问 _name 属性。
除了用作对象属性的键名之外,类型代表符号还可以用来创建一些内置的 Symbol 值,例如:
- Symbol.iterator:用来定义一个对象的默认迭代器方法;
- Symbol.asyncIterator:用来定义一个对象的异步迭代器方法;
- Symbol.toStringTag:用来定义一个对象的默认的 toString() 方法的返回值。
示例代码:
// javascriptcn.com 代码示例 const myIterable = { [Symbol.iterator]: function*() { yield 1; yield 2; yield 3; } }; for (let value of myIterable) { console.log(value); } // 输出: // 1 // 2 // 3 class AsyncIterable { [Symbol.asyncIterator]() { return { i: 0, next() { if (this.i < 3) { return Promise.resolve({ value: this.i++, done: false }); } return Promise.resolve({ done: true }); } }; } } (async function() { for await (let value of new AsyncIterable()) { console.log(value); } })(); // 输出: // 0 // 1 // 2 class Person { get [Symbol.toStringTag]() { return 'Person'; } } const person = new Person(); console.log(person.toString()); // "[object Person]"
总结:
类型代表符号是 ES7 中引入的一种基本数据类型,可以用来创建一个独一无二的值,可以用作对象属性的键名,以防止属性名的冲突。类型代表符号的一个重要应用是在对象中定义私有属性,可以使用访问器来读写该属性的值,外部无法直接访问私有属性。除此之外,类型代表符号还可以用来创建一些内置的 Symbol 值,例如 Symbol.iterator、Symbol.asyncIterator 和 Symbol.toStringTag 等。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656be876d2f5e1655d442910