我正在学习ES6的符号功能。
所以在节点中,我写下以下内容(实际上是在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");
}
}
答案 0 :(得分:5)
Symbol('somestring');
不创建全局符号。
Symbol.for('somestring');
获取先前定义的全局符号或创建新的全局符号。
因此,当您第一次检查case
语句时,您将创建新符号,而不是检查先前定义的符号。
如果您在首先定义符号时使用Symbol.for('somestring')
,则稍后检查它们时会找到它们。
答案 1 :(得分:3)
原因是因为Symbol('debug') !== Symbol.for('debug')
。
你需要写:
var levels = {
DEBUG: Symbol.for('debug'),
INFO: Symbol.for('info'),
WARN: Symbol.for('warn'),
};
使用
Symbol()
函数的上述语法将不创建整个代码库中可用的全局符号。要创建跨文件甚至跨域(每个域都有自己的全局范围)可用的符号,请使用方法Symbol.for()
和Symbol.keyFor()
来设置和检索全局符号注册表中的符号。
答案 2 :(得分:3)
每次对Symbol的调用都会创建一个符号的新实例。
所以符号(' foo')===符号(' foo')为假。
Symbol.for方法搜索给定的密钥。如果找不到密钥,则会创建密钥。否则返回已定义的值。
"use strict"
var levels = {
DEBUG: Symbol.for('debug'),
INFO: Symbol.for('info'),
WARN: Symbol.for('warn'),
};
function log(level, 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');