对象传播与 Object.assign

新手上路,请多包涵

假设我有一个 options 变量,我想设置一些默认值。

这两种选择的优点/缺点是什么?

使用对象传播

options = {...optionsDefault, ...options};

或使用 Object.assign

options = Object.assign({}, optionsDefault, options);

这是让我想知道的 提交

原文由 Olivier Tassinari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

这不一定是详尽的。

传播语法

options = {...optionsDefault, ...options};

优点:

  • 如果在没有本机支持的环境中编写代码以执行,您可以只编译此语法(而不是使用 polyfill)。 (以 Babel 为例。)

  • 不那么冗长。

缺点:

  • 最初编写此答案时,这是一个 提案,未标准化。在使用提案时,请考虑如果您现在使用它编写代码并且它没有标准化或随着它走向标准化而发生变化,您会做什么。此后,这已在 ES2018 中标准化。

  • 字面意思,不是动态的。


Object.assign()

 options = Object.assign({}, optionsDefault, options);

优点:

  • 标准化。

  • 动态的。例子:

 var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
 options = Object.assign.apply(Object, [{}].concat(sources));
 // or
 options = Object.assign({}, ...sources);

缺点:

  • 更冗长。

  • 如果在没有本机支持的环境中编写代码以执行,则需要 polyfill。


这是让我想知道的提交。

这与您要问的内容没有直接关系。该代码没有使用 Object.assign() ,而是使用了执行相同操作的用户代码( object-assign )。他们似乎正在使用 Babel 编译该代码(并将其与 Webpack 捆绑),这就是我所说的:您可以编译的语法。他们显然更愿意将 object-assign 作为依赖项包含在他们的构建中。

原文由 JMM 发布,翻译遵循 CC BY-SA 4.0 许可协议

这不一定是详尽无遗的。

传播语法

options = {...optionsDefault, ...options};

优点:

  • 如果编写在没有本机支持的环境中执行的代码,您可以只编译此语法(而不是使用 polyfill)。 (例如,使用 Babel。)

  • 不那么冗长。

缺点:

  • 最初写这个答案时,这是一个 提案,没有标准化。在使用提案时,请考虑如果您现在用它编写代码并且它没有得到标准化或随着它走向标准化而发生变化,您会怎么做。这已经在 ES2018 中标准化。

  • 字面上的,而不是动态的。


Object.assign()

 options = Object.assign({}, optionsDefault, options);

优点:

  • 标准化。

  • 动态的。例子:

   var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
  options = Object.assign.apply(Object, [{}].concat(sources));
  // or
  options = Object.assign({}, ...sources);

缺点:

  • 更冗长。
  • 如果编写代码以在没有本机支持的环境中执行,则需要 polyfill。

这是让我想知道的承诺。

这与您的要求没有直接关系。该代码没有使用 Object.assign() ,它使用的是执行相同操作的用户代码( object-assign )。他们似乎正在使用 Babel 编译该代码(并将其与 Webpack 捆绑在一起),这就是我所说的:您可以编译的语法。他们显然更愿意将 object-assign 作为一个依赖项包含在他们的构建中。

原文由 JMM 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题