node Object.assign 疑问?

  const userInfo = await userModel.findOne({_id:user_id});//这里查询结果是{a:1}
  const siginDay = await Sigin.findOne({_id:user_id},//这里查询结果是{b:1}
  let mergeObj = Object.assign(siginDay,userInfo);
  console.log(userInfo,siginDay,mergeObj)

代码如上:
Object.assign为浅拷贝,我打把上面结果合并一个对象,可以发现结果不对;
合并的结果只会出现Object.assign 最后一对象的值,而且userInfo,siginDay值也变了;这是什么原因呢。
演示如下:
如果Object.assign(siginDay,userInfo); 结果是{a:1}没有{b:1},而且userInfo,siginDay这两个的值也变成{a:1};反之,Object.assign(userInfo,siginDay);结果只有{b:1};
可是在node控制台运行Object.assign({a:1},{b:1})却能得到我要的结果{b:1,a:1}
求大神指导。

阅读 3k
3 个回答
Object.assign(target, ...sources)
The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object.

Object.assign() 将多个sources对象中的可枚举的自有属性复制到target对象中,然后返回target对象

var userInfo={a:1};
var siginDay={b:1};
var mergeObj = Object.assign(siginDay,userInfo);
console.log(userInfo);//{a: 1}
console.log(siginDay);//{b: 1, a: 1}
console.log(mergeObj);//{b: 1, a: 1}
console.log("mergeObj===siginDay ==>"+(mergeObj===siginDay));//true

siginDay对象被改写,包含原siginDay,userInfog合集,存在同名属性时,后面的覆盖前面的

=============

补充什么是自有属性,什么叫可枚举
一个对象属性如果是从原型中带来的,那它叫继承属性;
一个对象属性如果是不是从原型中带来的,那它叫自有属性;

一个对象属性可以通过Object.defineProperty方式定义一个对象的属性,可以设置属性是否可枚举,是否可配置,是否可写等属性.平常我们通过对象字面量的方式定义的对象属性是可枚举,可配置,非只读的

var prototypeObj={
   pProp:"1111"
};

var descriptor = Object.create(prototypeObj);
//定义一个名为ownKey1的不可枚举属性
Object.defineProperty(descriptor, 'ownKey2', {
  enumerable: false,//不可枚举
  configurable: false,//不可配置
  writable: true,//
  value: '2222'
});
//定义一个名为ownKey2的不可枚举属性
Object.defineProperty(descriptor, 'ownKey3', {
  enumerable: true,//不可枚举
  configurable: false,//不可配置
  writable: true,//
  value: '33333'
});


var userInfo={a:1};
var mergeObj = Object.assign({},userInfo,descriptor);
console.log(userInfo);//{a: 1}
console.log(descriptor.pProp);//111 继承的属性能被访问到
console.log(descriptor);
//只有可枚举的,自有属性能被复制到mergeObj
console.log(mergeObj);//{a: 1, ownKey3: "33333"} 

没有拿到你要结果的原因就是await 引起的。
由于这个异步,导致你在assgin的时候,前面还没有返回结果。
做如下修改试试:

Promise.resolve(() => {
  const userInfo = await userModel.findOne({_id:user_id});//这里查询结果是{a:1}
  return userInfo;
}).then(userInfo => {
    const siginDay = await Sigin.findOne({_id:user_id},//这里查询结果是{b:1}
    let mergeObj = Object.assign(siginDay,userInfo);
    return mergeObj;
}).then(data => console.log(data));

Object.assign({},siginDay,userInfo);用空对象接收
在合并之前打印下siginDayuserInfo的值,可能有一个为空

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