创建 Symbol:
// 使用 Symbol() 函数创建一个独一无二的 Symbol
const mySymbol = Symbol();
console.log(typeof mySymbol); // 输出:symbol
带描述的 Symbol:
可以在 Symbol 的参数中添加一个描述字符串:
const mySymbol = Symbol("This is a description");
console.log(mySymbol); // 输出:Symbol(This is a description)
Symbol 作为对象属性的键:
Symbol 可以用作对象属性的键,确保属性的唯一性:
const mySymbol = Symbol();
const obj = {
[mySymbol]: 'Hello, Symbol!'
};
console.log(obj[mySymbol]); // 输出:Hello, Symbol!
预定义的一些 Symbol 常量:
ES6 还定义了一些预定义的 Symbol 常量,它们存在于全局 Symbol 常量表中,例如 Symbol.iterator、Symbol.hasInstance、Symbol.toStringTag 等,用于定制对象的行为。
示例:使用 Symbol.iterator 实现可迭代对象:
const iterableObject = {
values: [1, 2, 3],
[Symbol.iterator]: function () {
let index = 0;
return {
next: () => {
if (index < this.values.length) {
return { value: this.values[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (const value of iterableObject) {
console.log(value);
}
// 输出:
// 1
// 2
// 3
使用 Symbol 避免属性名冲突:
const LOG_LEVEL = {
INFO: Symbol('info'),
WARN: Symbol('warn'),
ERROR: Symbol('error')
};
function logMessage(message, level = LOG_LEVEL.INFO) {
switch (level) {
case LOG_LEVEL.INFO:
console.log(`[INFO] ${message}`);
break;
case LOG_LEVEL.WARN:
console.warn(`[WARN] ${message}`);
break;
case LOG_LEVEL.ERROR:
console.error(`[ERROR] ${message}`);
break;
default:
throw new Error(`Unknown log level: ${level}`);
}
}
logMessage('This is an informational message');
logMessage('This is a warning', LOG_LEVEL.WARN);
logMessage('This is an error', LOG_LEVEL.ERROR);
这是一些关于 ES6 中 Symbol 的基本用法。Symbol 主要用于解决属性名冲突问题,并提供了一种创建独一无二标识符的机制。
转载请注明出处:http://www.zyzy.cn/article/detail/4672/ES6