当然,ES6 +必须有一种方法来合并两个JavaScript对象,它是什么?

我厌倦了总是不得不写这样的代码:

function shallowExtend(obj1,obj2){ var key; for ( key in obj2 ) { if ( obj2.hasOwnProperty(key) === false ) continue; obj1[key] = obj2[key] } } 

或者如果我不想自己编写代码,请实现一个已经存在的库。 当然,ES6 +正在为此提供一些东西,如Object.prototype.extend(obj2...)Object.extend(obj1,obj2...)

ES6 +也提供这样的function吗? 如果不在那里,那么是否计划了这样的function? 如果没有计划,那为什么不呢?

您将能够通过使用Object.assign在ES6中进行浅层合并/扩展/分配:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

句法:

Object.assign( target… sources );

其中… sources表示源对象。

注意:不要将语法定义中的…源与ES6扩展运算符混淆。

例:

 var obj1 = {name: 'Daisy', age: 30}; var obj2 = {name: 'Casey'}; Object.assign(obj1, obj2); console.log(obj1.name === 'Casey' && obj1.age === 30); // true 

你可以使用对象rest/传播这个:

 const merged = {...obj1, ...obj2} 

ECMAScript 提议目前处于阶段3,并且通过使用阶段3预设在Babel中启用。

目前正在讨论添加Object.mixin来照顾你所要求的行为。 https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html

虽然现在还没有ES6的草案,但似乎有很多支持,所以我想很快就会在草稿中出现。

我知道这是一个老问题,但ES2015 / ES6最简单的解决scheme其实很简单,使用Object.assign(),

希望这有助于,这也做深度合并:

 /** * Simple is object check. * @param item * @returns {boolean} */ export function isObject(item) { return (item && typeof item === 'object' && !Array.isArray(item) && item !== null); } /** * Deep merge two objects. * @param target * @param source */ export function mergeDeep(target, source) { if (isObject(target) && isObject(source)) { for (const key in source) { if (isObject(source[key])) { if (!target[key]) Object.assign(target, { [key]: {} }); mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return target; } 

用法示例:

 mergeDeep(this, { a: { b: { c: 123 } } }); // or const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}}); console.dir(merged); // { a: 1, b: { c: { d: [Object] } } } 

也许ES5的Object.defineProperties方法将完成这项工作?

例如

 var a = {name:'fred'}; var b = {age: {value: 37, writeable: true}}; Object.defineProperties(a, b); alert(a.age); // 37 

MDN文档: https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties

ES6

 Object.assign(o1,o2) ; Object.assign({},o1,o2) ; //safe inheritance var copy=Object.assign({},o1); // clone o1 //------Transform array of objects to one object--- var subjects_assess=[{maths:92},{phy:75},{sport:99}]; Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99} 

ES7或巴别

 {...o1,...o2} // inheritance var copy= {...o1};