2017-07-27 56 views
2

我意識到符號已被添加到ES2015,但沒有讀到太多關於他們。我現在已經做了一些閱讀,他們的目的顯然不是我想的。看來預期的目的是提供一種創建私有屬性的方法。我的理解是,它在某些功能語言中與某個原子類似,它備份爲here。我覺得很奇怪的是,它完全沒有提到我所incrorrectly認爲是他們的主要理由,這是在爲模式匹配字符串提供一個更有意義的替代方案:用符號似乎ES2015符號是否適合代替字符串作爲唯一的常量值?

export const FOO = 'This value is irrelevant as long as its unique'; 
// or 
export const FOO = Symbol('A sensible description of what foo represents'); 

switch(blah): 
    case FOO: do_something(); 
    ... 

在上述情況下具有許多優點,因爲它可以防止意外碰撞(即使兩個常量等於相同的字符串),從而消除了每次創建一個唯一字符串的負擔,併爲任何讀取代碼的人提供了一個明確的指示預期的目的。最後的考慮在某種程度上依賴於其他人同意我對應該使用符號的解釋。

無論如何,問題是,這是一個很好的符號用例,如果不是爲什麼不呢?

+0

我不認爲在理解什麼是符號的人之間可能會有任何分歧。它只是可以作爲屬性使用的唯一標記。 – estus

回答

5

看來預期的目的是提供一種創建私有屬性的方法。

不,完全沒有。非常非常早,這是一個激勵因素,但是在規範完成之前很久就被拋棄了。如果他們的目的是提供某種隱私,我們不會有Object.getOwnPropertySymbols

私人實例信息經歷了漫長而折磨的過程,並且仍在蜿蜒曲折;目前它是Class Fields proposal的一部分(以前是它自己的東西)。

無論如何,問題是,這是符號的好用例,如果不是,爲什麼不呢?

是的。 Symbol的主要目的之一是提供無衝突的唯一標識符。

§4.3.25 - Symbol value

代表一個獨特的,非String對象的屬性鍵原始值

而且從§6.1.5 - The Symbol Type

每個可能的符號價值是獨特的,不可變的。

當然,這並不是說動機,但它是指示性的。

+0

謝謝,我很高興知道我的推理是在錢上! – redrah

相關問題