在创建对象时,假设非字符串键将使用 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使用toString()将任何键转换为字符串,因此它可以工作,但我的问题是:

它有多安全?

根据 ES6 规范,在第四步中"ComputedPropertyName"的"12.2.6.8 运行时语义:评估"部分下,我们有:

  1. 返回 ToPropertyKey(propName)。

在第四步的"7.1.14 ToPropertyKey(参数)"下:

  1. 返回字符串(键)。

所以[expression]的结果会变得toString.另一方面,任何字符串都是属性的有效键,尽管其中一些只能通过括号访问。

相关内容

最新更新