我正在学习 ES6 的 Symbol 特性。
所以在节点中,我写了以下内容(实际上是在 Typescript 中)。它编译正常,但控制台记录“未找到”我做错了什么?在我看来,它应该有效。
本例来自this文章
"use strict"
var levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn'),
};
function log(level: Symbol, message)
{
switch(level)
{
case Symbol.for('debug'):
console.log(`Debug Message: ${message}`);
break;
case Symbol.for('info'):
console.log(`Info Message: ${message}`);
break;
case Symbol.for('warn'):
console.log(`Warn Message: ${message}`);
break;
default:
console.log("Not found");
}
}
log(levels.DEBUG, 'debug message');
log(levels.INFO, 'info message');
更新
正如已接受的答案中所指出的,这将起作用:
var levels = {
DEBUG: Symbol.for('debug'),
INFO: Symbol.for('info'),
WARN: Symbol.for('warn')
};
function log(level: Symbol, message)
{
switch(level)
{
case Symbol.for('debug'):
console.log(`Debug Message: ${message}`);
break;
case Symbol.for('info'):
console.log(`Info Message: ${message}`);
break;
case Symbol.for('warn'):
console.log(`Warn Message: ${message}`);
break;
default:
console.log("Not found");
}
}
log(levels.DEBUG, 'debug message');
log(levels.INFO, 'info message');
第二次更新
此外,正如@Felix Kling 所指出的,这甚至更好:
var levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
};
function log(level: Symbol, message)
{
switch(level)
{
case levels.DEBUG:
console.log(`Debug Message: ${message}`);
break;
case levels.INFO:
console.log(`Info Message: ${message}`);
break;
case levels.WARN:
console.log(`Warn Message: ${message}`);
break;
default:
console.log("Not found");
}
}
最佳答案
Symbol('somestring');
不创建全局符号。
Symbol.for('somestring');
获取先前定义的全局符号或创建新的全局符号。
因此,您第一次检查 case
语句时,您是在创建新的符号,而不是检查您之前定义的符号。
如果您在首先定义符号时使用 Symbol.for('somestring')
,则稍后检查它们时会找到它们。
关于javascript - 比较 Javascript 符号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41151911/