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é)果合并一個(gè)對(duì)象,可以發(fā)現(xiàn)結(jié)果不對(duì);
合并的結(jié)果只會(huì)出現(xiàn)Object.assign 最后一對(duì)象的值,而且userInfo,siginDay值也變了;這是什么原因呢。
演示如下:
如果Object.assign(siginDay,userInfo); 結(jié)果是{a:1}沒有{b:1},而且userInfo,siginDay這兩個(gè)的值也變成{a:1};反之,Object.assign(userInfo,siginDay);結(jié)果只有{b:1};
可是在node控制臺(tái)運(yùn)行Object.assign({a:1},{b:1})卻能得到我要的結(jié)果{b:1,a:1}
求大神指導(dǎo)。
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() 將多個(gè)sources對(duì)象中的可枚舉的自有屬性復(fù)制到target對(duì)象中,然后返回target對(duì)象
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對(duì)象被改寫,包含原siginDay,userInfog合集,存在同名屬性時(shí),后面的覆蓋前面的
=============
補(bǔ)充什么是自有屬性,什么叫可枚舉
一個(gè)對(duì)象屬性如果是從原型中帶來的,那它叫繼承屬性;
一個(gè)對(duì)象屬性如果是不是從原型中帶來的,那它叫自有屬性;
一個(gè)對(duì)象屬性可以通過Object.defineProperty方式定義一個(gè)對(duì)象的屬性,可以設(shè)置屬性是否可枚舉,是否可配置,是否可寫等屬性.平常我們通過對(duì)象字面量的方式定義的對(duì)象屬性是可枚舉,可配置,非只讀的
var prototypeObj={
pProp:"1111"
};
var descriptor = Object.create(prototypeObj);
//定義一個(gè)名為ownKey1的不可枚舉屬性
Object.defineProperty(descriptor, 'ownKey2', {
enumerable: false,//不可枚舉
configurable: false,//不可配置
writable: true,//
value: '2222'
});
//定義一個(gè)名為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);
//只有可枚舉的,自有屬性能被復(fù)制到mergeObj
console.log(mergeObj);//{a: 1, ownKey3: "33333"} 沒有拿到你要結(jié)果的原因就是await 引起的。
由于這個(gè)異步,導(dǎo)致你在assgin的時(shí)候,前面還沒有返回結(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年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。