javascript - 比较 Javascript 符号不起作用

标签 javascript ecmascript-6

我正在学习 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/

相关文章:

javascript - 如何制作部分滚动的div?

javascript - HTML 计算器不会显示任何内容

javascript - ajax post 调用在将数组发送到 Spring Rest Controller 时导致 400(错误请求)

javascript - 以父组件内对象的形式从所有子组件获取合并数据 : React JS

javascript - 如何将服务 worker 注册到重定向的脚本 URL

javascript - 在 Hot Towel/Durandal 单页应用程序中加载 View (激活)时调用函数

javascript - 在嵌套数组中查找值

javascript - 如何纠正这个缓存函数

javascript - ES6 模块 : How to automatically re-export all types in the current directory from index. js?

javascript - 使用 forEach es6 将对象数组添加到对象数组中