2016-11-28 35 views
0

我想創建一個字典將字符串映射到符號,以便我可以爲對象分配一個始終指向唯一符號的唯一「t」屬性。是否可以提取符號的內容?

我無法弄清楚如何從符號中取出符號內的原始字符串,以便我可以查找符號表來檢查符號的有效性。

這裏的示例代碼:

var t = { 
    'Box': Symbol("Box") 
}; 

var Box = (function() { 
    var Box = function(x) { 
     this.t = t['Box']; 
     this.x = x; 
    }; 

    return Box; 
})(); 

var q = new Box(2); 
console.log(q); 
console.log(q.t); 

我想知道是否有可能得到字符串「盒子」背出象徵符號(盒),而無需使用正則表達式或創建一個新的結構,包含字符串「Box」和符號「Box」(這可能是最好的第二種解決方案)。

+0

你的意思是由「*,這樣我可以查找符號表,檢查符號的有效性*」,以及爲什麼你需要的符號對這樣的描述?整個符號點不是使用字符串比較,而是依賴於符號的標識。 – Bergi

+0

假設我使用符號標識對象;我不能使用Symbol作爲我的字典的關鍵。即使我知道foo.t是符號(Box),我也無法檢查它是表1,表2,表3中的符號(Box)還是來自恰好具有Box的外部腳本中的某個表。爲了解決這個問題,我需要得到符號字符串,並通過查找「盒子」並給我我的符號(盒子)的字符串查找我的具體符號表格,並且我可以將此符號與此特定符號(盒子) 。 – Dmitry

+0

當然,您可以使用符號作爲字典的關鍵字 - 屬性鍵不必是字符串,它們也可以是符號。或者,您可以使用數組,設置或映射您的表。正如我所說的,使用字符串進行查找會失敗符號的全部用途,您可以立即將字符串存儲在'.t'中。如果兩個模塊使用相同的符號描述,它們會發生碰撞。 – Bergi

回答

1

您應該使用forkeyFor成員在Symbol原始 如果你在一個字符串傳遞到for方法它搜索全球registory該字符串,如果發現該字符串已經註冊它檢索值的字符串,否則它會註冊字符串 keyFor檢索符號的值。傳遞了無效的參數keyFor將拋出一個錯誤>>Symbol.keyFor(arg),ARG必須是一個符號 e.g

'use strict'; 
let myName = Symbol.for('victory'); 
console.log(Symbol.keyFor(myName)); // 'victory' 

您的解決方案

var t = { 
'Box': Symbol.for("Box") 
}; 

var Box = (function() { 
    var Box = function(x) { 
    this.t = t['Box']; 
    this.x = x; 
}; 

    return Box; 
})(); 

var q = new Box(2); 
console.log(q); 
console.log(Symbol.keyFor(q.t)); 
+2

等待,所以Symbol.for創建一個全局符號,Symbol.keyFor找到全局符號,但它們都不符合Symbol('blah')...這是否比創建自己的表映射效率更高Strings to字符串,符號對?因爲我想避免使用全局符號,因爲我可能希望將來在另一個上下文中使用它們,例如多個符號表,但一個表中的一個符號不等於另一個表中的符號。 – Dmitry

+1

@Dmitry'Symbol.for'只是在GlobalSymbolRegistry中存儲一個符號。我不認爲這比實施自己的註冊表更有效。 – Oriol

+0

開始時它總是空的嗎?有沒有辦法遍歷全球符號註冊表? – Dmitry

0

你並不需要使用正則表達式。一個簡單的slice將工作:

console.log(Symbol("Box").toString().slice(7, -1)); // "Box"

即必須努力根據規格:

19.4.3.2 Symbol.prototype.toString ()

  1. 小號值。
  2. 如果Type小號)是符號,讓符號小號

  3. 返回SymbolDescriptiveString符號)。

19.4.3.2.1 Runtime Semantics: SymbolDescriptiveString (sym)

  • 遞減符號的[[說明]]值。
  • 如果遞減不確定,讓遞減爲空字符串。

  • 返回串聯字符串"Symbol("遞減")"的結果。

  • +0

    它仍然依賴於符號的特定字符串格式;當我說正則表達式時,我暗指任何形式的字符串操作。很高興知道JS支持類似perl的消極切片,但右偏移。 – Dmitry

    +1

    @Dmitry它依賴於規範強制執行的字符串化。該規範不提供任何其他方式來閱讀[[說明]]。 – Oriol

    相關問題