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

m0m*_*eni 6 javascript ecmascript-6

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

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

但是知道这些,当它们组合在一起时它们意味着什么...!!?我无法理解最后一行:

{
  ...resolveAction,
  ...isAction(rejected) ? rejected : {
    ...!!rejected && { payload: rejected }
}
Run Code Online (Sandbox Code Playgroud)
  1. ...resolveAction只是传播键resolveAction.
  2. ...isAction(rejected) ?将检查是否rejected解决了一个动作然后将其传播.(也不确定这一个)
  3. rejected如果为true,则添加到object
  4. {...!!rejected && { payload: rejected } ????????????????

怎么...!!连有效的语法?有两种选择:

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

  2. 如果!!首先应用它,它是一个布尔值,它不能传播.

所以它没有任何意义,或者我错过了一些东西,因为给定代码,我假设它试图传播一个布尔值.

m0m*_*eni 3

好的,下载 npm 模块并查看转译代码后,我发现了这一行:

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

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

_extends({}, !!rejected && { payload: rejected })
Run Code Online (Sandbox Code Playgroud)

基本上,如果!!rejected为真,那么它将把有效负载传播到对象中。如果不只是_extends({}, false)回报的话{}

这项工作的关键是它的...优先级低于整条生产线中的任何其他运算符。记住这一点,您就可以开始理解它了。