什么是 ...!! ES6中的语法?

时间:2016-01-24 04:31:14

标签: javascript ecmascript-6

我正在阅读:https://github.com/pburtchaell/redux-promise-middleware/blob/master/src/index.js

我知道...被用作对象传播。我知道!!用于将任何东西转换为具有相同真实性的布尔值。

然而,当他们像...!!一样整理时,他们知道这是什么意思?我无法理解最后一行:

{
  ...resolveAction,
  ...isAction(rejected) ? rejected : {
    ...!!rejected && { payload: rejected }
}
  1. ...resolveAction只是传播resolveAction
  2. 的键
  3. ...isAction(rejected) ?会检查rejected是否解决了某项操作,然后将其传播。 (也不确定这个)
  4. 如果为true,则将rejected添加到对象
  5. {...!!rejected && { payload: rejected } ???????????????
  6. ...!!如何有效的语法?有两种选择:

    1. 如果它首先传播对象,那么!!将应用于所有传播键

    2. 如果首先应用!!,则它是一个布尔值,并且无法传播。

    3. 所以它没有任何意义,或者我错过了一些东西,因为考虑到代码,我认为它试图传播一个布尔值。

2 个答案:

答案 0 :(得分:3)

好的,所以在下载了npm模块并浏览了转换后的代码后,我找到了一行:

return dispatch(isThunk(rejected) ? rejected.bind(null, resolveAction) : _extends({}, resolveAction, isAction(rejected) ? rejected : _extends({}, !!rejected && { payload: rejected })));

其中相关部​​分在这里:

_extends({}, !!rejected && { payload: rejected })

基本上如果!!rejected为真,那么它会将有效负载扩展到对象中。如果不是_extends({}, false),则只返回{}

这项工作的关键是...的优先级低于整行中的任何其他运算符。考虑到这一点,你可以开始理解它。

答案 1 :(得分:1)

相关问题是What is "x && foo()"?

奇怪的语法

{...!!rejected && { payload: rejected }}

被解析为

{ ... ((!!rejected) && { payload: rejected }) }

确实!!确实将rejected强制转换为布尔值,然后在真实时将其计算到对象。写这个的更好方法是

{ ...(rejected ? {payload: rejected} : null) }

当然整个内部对象文字是多余的。它可能只是

{
  ...resolveAction,
  ...(isAction(rejected) ? rejected : (rejected ? {payload: rejected} : null))
}

(如你所知,省略括号)

相关问题