Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
// Object.assign(目标对象,源对象)
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
Object.assign(target, ...sources)

target

目标对象。

sources

目标对象。

如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。

注意:  js中基本包装类型的原型属性是不可枚举的

复制一个对象

const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

深拷贝问题

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。

const log = console.log;
function test() {
  'use strict';
  let obj1 = { a: 0 , b: { c: 0}};
  let obj2 = Object.assign({}, obj1);
  log(JSON.stringify(obj2));
  // { a: 0, b: { c: 0}}
  obj1.a = 1;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 0}}
  log(JSON.stringify(obj2));
  // { a: 0, b: { c: 0}}
  obj2.a = 2;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 0}}
  log(JSON.stringify(obj2));
  // { a: 2, b: { c: 0}}
  obj2.b.c = 3;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 3}}
  log(JSON.stringify(obj2));
  // { a: 2, b: { c: 3}}
  // Deep Clone
  obj1 = { a: 0 , b: { c: 0}};
  let obj3 = JSON.parse(JSON.stringify(obj1));
  obj1.a = 4;
  obj1.b.c = 4;
  log(JSON.stringify(obj3));
  // { a: 0, b: { c: 0}}
test();
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };
const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。

合并具有相同属性的对象

const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };
const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
Object.assign()Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。const target = { a: 1, b: 2 };const source = { b: 4, c: 5 };// Object.assign(目标对象,源对象)const returnedTarget = Object.assign(target, source);console.log(target);// expected ou
本文实例讲述了JavaScript比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: 在Python中可以通过cmp()内建函数来比较两个对象所包涵的数据是否相等(数组、序列、字典)。但是在javascript语言中并没有相关的实现。本js代码通过对js对象进行各方面的比较来判断两个对象是否相等 cmp = function( x, y ) { // If both x and y are null or undefined and exactly the same if ( x === y ) { return true; // If they are not stric
lodash-assign:https://www.lodashjs.com/docs/latest#_assignobject-sources mdn-assign:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign Object.assign() 方法用于将...
对象属性深度合并覆盖方法 文章目录对象属性深度合并覆盖方法需求Object.assign()Object.assign()的定义与声明用例1用例2用例3实现思路测试用例1用例2源码进阶思路测试源码 实现一个通用方法,要求 实现类似Object.assign()的属性覆盖功能,且当对象内部有重名子对象时,对重名的子对象也实现属性覆盖合并 Object.assign() Object.assign()实现浅拷贝 对于内部子对象时传递的引用 Object.assign()的定义与声明
解构及数组对象操作列表解构参数解构数组解构对象解构复杂解构嵌套数组对象数组的操作数组练习对象的操作 JS的解构很灵活,参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator var parts = ['shoulder', 'knees']; var ly...
let formData = new FormData(); for (let i = 0; i < direction.length; i++) { formData.append('file', direction[i]) formData.append('buckName', 'interfaced
最近发现用obj.property这种方式来为属性添加属性,或者是修改属性值,有点太过麻烦,就想到了es6解构赋值,这样能够方便的在原有对象的基础上增加新属性,但是有属性重复时是怎样的合并规则呢?之前没有试过,我菜。今天做了个实验,写写博客刷刷分。 var b = { name:"小明", gender:"女", name: "小红" //{name: "小红", gender: "女"} 所以构造对象时, 后声明的属性覆盖同名属性的值, var a = {n 3. 在循环中,首先获取当前元素的下标。 4. 判断第二个数组中是否存在相同下标的元素。 5. 如果存在,则将两个下标相同的元素进行合并,并将合并后的结果添加到新数组中。 6. 如果不存在,则将当前元素直接添加到新数组中。 7. 循环结束后,新数组中就保存了两个原数组中下标相同的元素合并后的结果。 例如,假设有两个数组: ```javascript var array1 = [{id:1, name:'Alice'}, {id:2, name:'Bob'}, {id:3, name:'Charlie'}]; var array2 = [{id:1, age:18}, {id:2, age:20}, {id:4, age:22}]; 经过合并后的结果为: ```javascript var mergedArray = [{id:1, name:'Alice', age:18}, {id:2, name:'Bob', age:20}]; 需要注意的是,合并的操作可以根据具体需求进行调整,例如可以合并多个属性,或者只选择其中一部分属性进行合并