鍍金池/ 問答/數(shù)據(jù)庫  HTML/ node Object.assign 疑問?

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為淺拷貝,我打把上面結果合并一個對象,可以發(fā)現(xiàn)結果不對;
合并的結果只會出現(xiàn)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}
求大神指導。

回答
編輯回答
陪我終
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"} 
2018年3月28日 19:31
編輯回答
黑與白

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

2018年2月8日 05:54
編輯回答
笨笨噠

沒有拿到你要結果的原因就是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));
2017年9月6日 12:06