在创建对象时假设非字符串键将使用 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" 的第四步中,我们有:
- Return ToPropertyKey(propName).
在第四步"7.1.14 ToPropertyKey ( argument )"下:
- Return ToString(key).
所以[expression]
的结果会变成toString
。另一方面,any string is a valid key 对应 属性,尽管其中一些只能通过括号访问。
作为我编写的库的一部分,我想让用户将函数作为对象的键传递:
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" 的第四步中,我们有:
- Return ToPropertyKey(propName).
在第四步"7.1.14 ToPropertyKey ( argument )"下:
- Return ToString(key).
所以[expression]
的结果会变成toString
。另一方面,any string is a valid key 对应 属性,尽管其中一些只能通过括号访问。