2016-12-14 41 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');