具有必需值和空对象的参数对象解构

Parameter Object Destructuring with Required Values and Empty Object

使用 ES6 参数对象解构,我们可以要求某些属性的存在,以及提供 default values. Dr. Axel Rauschmayer said in the Six nifty ES6 tricks article 参数默认值仅在实际使用时才被评估。

下一个示例将提供有关我不理解的内容的更多上下文:

function ajax({
  type = requireParameter("type"),
  url = requireParameter("url"),
  data = requireParameter("data"),
  success = requireParameter("success"),
  error = requireParameter("error"),
  isAsync = requireParameter("isAsync")
  } = {}) {
    console.log(JSON.stringify({
      type,
      url,
      data,
      success,
      error,
      isAsync
    }, null, 2));
};

function requireParameter(name) {
  throw new Error (`Missing parameter "${name}"`);
}

try {
  ajax({
    type: "get",
    url: "http://my.api.io",
    data: {},
    success: () => {},
    error: () => {},
    isAsync: true
  });
} catch (e) {
  console.warn(e.message);
}

ajax 第一个参数函数上使用 {...} = {}{...} 将具有相同的行为。因此,当我测试两个选项之一时,我无法断定 {...} = {} 逻辑的作用。

我在这里提出的问题是:

为什么我们需要对象等于 ajax 函数第一个参数的空对象?

在您的特定示例中,您不需要将被破坏的对象默认为空对象,因为您的预期行为是在缺少参数时抛出异常。当没有提供参数时,您可以使用它的属性来默认对象:

function ajax({
  type = requireParameter("type"),
  url = requireParameter("url"),
  data = requireParameter("data"),
  success = requireParameter("success"),
  error = requireParameter("error"),
  isAsync = requireParameter("isAsync")
} = {
    type: "get",
    url: "http://my.api.io",
    data: {},
    success: () => {},
    error: () => {},
    isAsync: true
  }) {
    console.log(JSON.stringify({
      type,
      url,
      data,
      success,
      error,
      isAsync
    }, null, 2));
};

function requireParameter(name) {
  throw new Error (`Missing parameter "${name}"`);
}

try {
  ajax(/* Don't provide anything and use the default */);
} catch (e) {
  console.warn(e.message);
}