写在前面
Symbol是JavaScript中一种基本数据类型,于ES6引入,用于表示唯一的标识符。 本文只探讨一些Symbol的应用场景,想要了解Symbol基础知识的,推荐阅读[阮一峰的ES6入门](Symbol - ECMAScript 6入门 (ruanyifeng.com))
应用场景
(1)创建私有属性
使用Symbol作为对象的属性名可以防止属性被意外覆盖或者访问,从而实现私有属性的效果。以下代码中的Symbol属性就是私有属性,不能通过对象实例直接访问
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
(2)创建唯一的对象键名
使用Symbol作为对象的属性名可以避免属性名冲突的问题,因为每个Symbol都是唯一的。
const obj = {};
const symbol1 = Symbol('symbol1');
const symbol2 = Symbol('symbol2');
obj[symbol1] = 'value1';
obj[symbol2] = 'value2';
console.log(obj[symbol1]); // value1
console.log(obj[symbol2]); // value2
(3)实现对象的迭代器
以下代码中的Symbol.iterator定义了一个数组对象的迭代器,可以使用for...of循环进行遍历。
const arr = [1, 2, 3];
arr[Symbol.iterator] = function () {
let index = 0;
return {
next: () => ({
done: index >= arr.length,
value: arr[index++],
}),
};
};
for (const value of arr) {
console.log(value);
}