比较Javascript符号不起作用

Gre*_*Gum 1 javascript ecmascript-6

我正在学习ES6的Symbol功能.

所以在节点中,我写下以下内容(实际上是在Typescript中).它编译得很好,但控制台记录"未找到"我做错了什么?在我看来,它应该工作.

这个例子来自这篇文章

"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');
Run Code Online (Sandbox Code Playgroud)

更新

正如在接受的答案中所指出的,这将起作用:

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');
Run Code Online (Sandbox Code Playgroud)

第二次更新

另外,正如@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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 5

Symbol('somestring');
Run Code Online (Sandbox Code Playgroud)

不创建全局符号.

Symbol.for('somestring');
Run Code Online (Sandbox Code Playgroud)

获取先前定义的全局符号或创建新的全局符号.

因此,第一次检查case语句时,您将创建新符号,而不是检查先前定义的符号.

如果您Symbol.for('somestring')在首先定义符号时使用,则稍后检查它们时会找到它们.