对象传播与Object.assign

比方说,我有一个选项variables,我想设置一些默认值。

这两个select的好处/缺点是什么?

使用对象传播

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

或者使用Object.assign

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

这是让我怀疑的承诺 。

这不一定是详尽的。

扩展语法

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

优点:

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

  • 不详细。

缺点:

  • 一个build议 ,不规范。 (考虑一下如果你现在写这个东西,你会做什么,而不是标准化。)

  • 文字,而不是dynamic的。


Object.assign()

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

优点:

  • 标准化。

  • dynamic。 例:

     var sources = [{a: "A"}, {b: "B"}, {c: "C"}]; options = Object.assign.apply(Object, [{}].concat(sources)); 
  • 更详细。

缺点:

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

这是让我怀疑的承诺。

这不是直接关系到你的要求。 该代码没有使用Object.assign() ,它使用用户代码( object-assign )来执行相同的操作。 他们似乎在和Babel编译这个代码(把它和Webpack捆绑在一起),这就是我刚才所说的:你可以编译的语法。 他们显然更喜欢将object-assign作为一个依赖关系来进行构build。

对象扩展运算符(…)在浏览器中不起作用,因为它不是任何ES规范的一部分,只是一个提议。 唯一的select是用Babel(或类似的东西)编译它。

正如你所看到的,它只是Object.assign({})上的语法糖。

据我所知,这些是重要的差异。

  • Object.assign可在大多数浏览器中使用(无需编译)
  • ...对象不规范
  • ...保护你不小心突变的对象
  • ...将在没有它的浏览器中填充Object.assign
  • ...需要更less的代码来expression相同的想法

正如其他人所提到的,在写作的这一刻, Object.assign()需要一个polyfill和对象传播...需要一些transpiling(也可能是一个polyfill)才能工作。

考虑这个代码:

 // Babel wont touch this really, it will simply fail if Object.assign() is not supported in browser. const objAss = { message: 'Hello you!' }; const newObjAss = Object.assign(objAss, { dev: true }); console.log(newObjAss); // Babel will transpile with use to a helper function that first attempts to use Object.assign() and then falls back. const objSpread = { message: 'Hello you!' }; const newObjSpread = {...objSpread, dev: true }; console.log(newObjSpread); 

这些都产生相同的输出。

这里是Babel的输出到ES5:

 var objAss = { message: 'Hello you!' }; var newObjAss = Object.assign(objAss, { dev: true }); console.log(newObjAss); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var objSpread = { message: 'Hello you!' }; var newObjSpread = _extends({}, objSpread, { dev: true }); console.log(newObjSpread); 

这是我迄今为止的理解。 Object.assign()实际上是标准化的,对象传播...还没有。 唯一的问题是浏览器支持前者,后者也支持后者。

玩这里的代码

希望这可以帮助。

这现在是ES6的一部分,因此是标准化的,在MDN上也有logging: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

使用起来非常方便,并且与对象解构一起使用很有意义。

上面列出的剩下的一个优点是Object.assign()的dynamic能力,然而这就像在一个文字对象内部传播数组一样简单。 在编译的babel输出中,它完全使用Object.assign()

所以正确的答案是使用对象传播,因为它现在是标准化,广泛使用(见react,redux等),易于使用,并具有Object.assign()的所有function。