This isn’t necessarily exhaustive.

Spread syntax

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


  • If authoring code for execution in environments without native support, you may be able to just compile this syntax (as opposed to using a polyfill). (With Babel, for example.)

  • Less verbose.


  • When this answer was originally written, this was a proposal, not standardized. When using proposals consider what you’d do if you write code with it now and it doesn’t get standardized or changes as it moves toward standardization. This has since been standardized in ES2018.

  • Literal, not dynamic.


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


  • Standardized.

  • Dynamic. Example:

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


  • More verbose.
  • If authoring code for execution in environments without native support you need to polyfill.

This is the commit that made me wonder.

That’s not directly related to what you’re asking. That code wasn’t using Object.assign(), it was using user code (object-assign) that does the same thing. They appear to be compiling that code with Babel (and bundling it with Webpack), which is what I was talking about: the syntax you can just compile. They apparently preferred that to having to include object-assign as a dependency that would go into their build.