2017-10-16 88 views
0

當我寫一個庫的一部分,我希望讓用戶將函數作爲對象的關鍵點:在創建對象時,如何安全地假定使用toString()將非字符串鍵轉換爲字符串?

https://github.com/welldone-software/redux-toolbelt/tree/master/packages/redux-toolbelt#makereducer

例如,在下面,increaseBy是一個自定義toString()返回一個函數字符串和decreaseBy.TYPE是一個字符串。

const reducer = makeReducer({ 
    [increaseBy]: (state, {payload}) => state + payload, 
    [decreaseBy.TYPE]: (state, {payload}) => state - payload, 
}, { defaultState: 100 }) 

哪裏increaseBy是具有自定義toString()解析爲一個字符串的函數。

JS translates any key to string使用toString()所以它的工作原理,但我的問題是:

是如何安全的呢?

+1

從技術上講,它在ES2015環境中是安全的。但是,您現在依賴隱式類型強制。每個人都在看你的代碼,不能立即告訴對象有什麼屬性名稱。並考慮沒有自定義'toString'的函數:'const id = x => x; o = {[id]:「foo」}' 產生'{x => x:「foo」}'。 – ftor

+0

是的,我知道。如果你看看我們的圖書館,從流程中可以清楚看到。我不只是將自定義的'toString()'作爲對象的鍵來指定一個隨機函數:) –

回答

2

按照ES6說明書中,下在第四步驟中部分"12.2.6.8 Runtime Semantics: Evaluation"「ComputedPropertyName」我們有:

  • 返回ToPropertyKey(PROPNAME)。
  • 其中"7.1.14 ToPropertyKey (argument)"在第四步驟中下:

  • 返回的ToString(鍵)。
  • 所以[expression]結果將成爲toString。另一方面,any string is a valid key屬性,雖然其中一些只能通過括號訪問。

    +0

    正是我所期待的。謝謝。 –

    +0

    但我不明白你的意見通過括號訪問。它與我所問的有什麼關係? –

    +0

    @VitalikZaidman它與你提出的問題無關。我只想指出,並非所有屬性都可以通過點符號來訪問,其中一些屬性只能使用方括號來訪問。 –