在创建对象时假设非字符串键将使用 toString() 转换为字符串有多安全?

How safe is to assume, when creating an object, that non-string keys will be converted to strings using toString()?

作为我编写的库的一部分,我想让用户将函数作为对象的键传递:

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

例如,在下面,increaseBy是一个带有自定义toString()的函数,returns是一个字符串,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() 所以它有效,但我的问题是:

安全吗?

根据 ES6 规范,在 "ComputedPropertyName" 部分 "12.2.6.8 Runtime Semantics: Evaluation" 的第四步中,我们有:

  1. Return ToPropertyKey(propName).

在第四步"7.1.14 ToPropertyKey ( argument )"下:

  1. Return ToString(key).

所以[expression]的结果会变成toString。另一方面,any string is a valid key 对应 属性,尽管其中一些只能通过括号访问。