在 JavaScript 中,在其他没有默认参数的参数之前为某些参数定义具有默认参数的函数有什么意义?

In JavaScript, what is the point of defining a function with default parameters for some arguments before other arguments without default parameters?

我正在阅读 Redux 文档,有些事情让我很困惑。 documentation 中的许多(如果不是全部的话)示例 reducer 函数都具有这种签名:

function visibilityFilter(state = 'SHOW_ALL', action) {
  switch (action.type) {
    case 'SET_VISIBILITY_FILTER':
      return action.filter
    default:
      return state
  }
}

当仍然需要 action 时,提供默认值 state 有什么意义?

在该特定代码示例中,调用 visibilityFilter 而不提供 action 参数将导致在 switch 语句中出现 TypeError

但是为了提供 action 参数,还必须提供 state 参数,因此默认值被覆盖且无用。据我所知,在 JavaScript 语法中根本没有办法在仅提供 action 参数的情况下调用 visiblityFilter 函数。

这只是 Redux 世界中的一些 funky/bad 编码风格吗?我错过了什么?

这是一些非常奇怪的代码,但有一种情况可以使用默认参数 - 如果 undefined 作为第一个参数显式传递:

function visibilityFilter(state = 'SHOW_ALL', action) {
  switch (action.type) {
    case 'SET_VISIBILITY_FILTER':
      return action.filter
    default:
      return state
  }
}

console.log(visibilityFilter(undefined, {}));

(并不是说我会推荐在大多数情况下编写看起来像这样的代码)

特别是对于 Redux,这种事情可能会出现 "naturally" 因为该函数是一个 reducer,与 createStore 一起使用。如果 createStore 传递了一个初始状态,它将作为 reducer 的第一个参数传递给 reducer;否则,Redux 的内部机制将使用 undefined 第一个参数显式调用它。