const userInfo = await userModel.findOne({_id:user_id});//這里查詢結(jié)果是{a:1}
const siginDay = await Sigin.findOne({_id:user_id},//這里查詢結(jié)果是{b:1}
let mergeObj = Object.assign(siginDay,userInfo);
console.log(userInfo,siginDay,mergeObj)
代碼如上:Object.assign
為淺拷貝,我打把上面結(jié)果合并一個對象,可以發(fā)現(xiàn)結(jié)果不對;
合并的結(jié)果只會出現(xiàn)Object.assign
最后一對象的值,而且userInfo,siginDay
值也變了;這是什么原因呢。
演示如下:
如果Object.assign(siginDay,userInfo);
結(jié)果是{a:1}
沒有{b:1}
,而且userInfo,siginDay
這兩個的值也變成{a:1}
;反之,Object.assign(userInfo,siginDay);
結(jié)果只有{b:1}
;
可是在node
控制臺運行Object.assign({a:1},{b:1})
卻能得到我要的結(jié)果{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"}
沒有拿到你要結(jié)果的原因就是await
引起的。
由于這個異步,導致你在assgin
的時候,前面還沒有返回結(jié)果。
做如下修改試試:
Promise.resolve(() => {
const userInfo = await userModel.findOne({_id:user_id});//這里查詢結(jié)果是{a:1}
return userInfo;
}).then(userInfo => {
const siginDay = await Sigin.findOne({_id:user_id},//這里查詢結(jié)果是{b:1}
let mergeObj = Object.assign(siginDay,userInfo);
return mergeObj;
}).then(data => console.log(data));
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。