2016-12-03 202 views
6

ES6中的Symbol上有一個.toString(),它返回Symbol的字符串表示形式,但想知道爲什麼'' + Symbol()不起作用(運行此表達式會拋出TypeError,我不期望)?後者是否只需在新的Symbol上調用.toString()並附加(+)它爲空字符串?將JavaScript符號轉換爲字符串?

+1

@Dai'''+ 123'作爲隱式類型轉換,但爲什麼'''+ Symbol()'即使被認爲是隱式轉換也不起作用? – Thomson

+0

對不起,我誤解了你的問題。你實際上看到了什麼行爲?你有'TypeError'還是其他的? – Dai

+0

@戴,對不起,這個問題引起了困惑。修改了一下。我看到'''+ Symbol()'拋出了TypeError,並想知道爲什麼它會這樣做,因爲Symbol()。toString()'工作。 – Thomson

回答

8

是後者只是一個新的Symbol調用.toString()和append(+)到空字符串?

實際上,符號不能隱式轉換爲字符串或數字,儘管有趣的是,您可以將它們隱式轉換爲布爾值。

在一些陷阱MDN actually has a section

符號類型轉換

有些事情與符號的類型轉換工作時要注意。

  • 當試圖一個符號轉換爲一個數字,一個TypeError將被拋出(例如+symsym | 0)。
  • 當使用鬆散平等,Object(sym) == sym返回true.
  • Symbol("foo") + "bar"拋出一個TypeError(不能轉換符號串)。例如,這可以防止您從符號中靜靜地創建新的字符串屬性名稱。
  • 「安全」String(sym)轉換的工作方式類似於使用符號調用Symbol.prototype.toString(),但請注意new String(sym)會丟失。

此行爲規範記錄下abstract ToString operation

參數類型:符號

結果:拋出一個TypeError例外。

,類似的還有abstract ToNumber operation

參數類型:符號

結果:拋出一個TypeError例外。

投下Symbol爲字符串沒有TypeError,你必須使用toString方法,或String()

+1

是否隱式將對象轉換爲字符串意味着在對象上調用'Object.prototype.toString()'? – Thomson

+0

@Thomson是的,隱式地將一個對象轉換爲一個字符串會調用'toString'方法,無論是在實例本身(如果有)或者原型中。 –

+0

作爲你的評論,因爲'Symbol'實例('Symbol()')上有一個可用的'toString()',所以將'Symbol'隱式轉換爲'String'應該成功? – Thomson