2016-12-14 79 views
1

我正在学习ES6的符号功能。比较Javascript符号不起作用

所以在节点中,我写了下面的内容(实际上是在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克林指出,这是更好的:

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"); 
    } 
} 
+2

你有为什么不起作用的答案。但是,我建议不要使用Symbol.for,而是使用'case levels.DEBUG:'来代替。 –

回答

5
Symbol('somestring'); 

不创建一个全球性的符号。

Symbol.for('somestring'); 

要么获取先前定义的全局符号,要么创建新的全局符号。

因此,您第一次检查您的case声明时,您正在创建新符号而不是检查您以前定义的符号。

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

3

原因是因为Symbol('debug') !== Symbol.for('debug')

你需要写:

var levels = { 
    DEBUG: Symbol.for('debug'), 
    INFO: Symbol.for('info'), 
    WARN: Symbol.for('warn'), 
}; 

MDN: Symbol

使用Symbol()功能创建全球符号,它是在你的整个代码库可用上述语法。要创建跨文件甚至跨域的符号(每个域都有其全局范围),请使用方法Symbol.for()Symbol.keyFor()来设置和检索全局符号注册表中的符号。

3

每次调用Symbol都会创建符号的新实例。

So Symbol('foo')=== Symbol('foo')为false。

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');