2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
短篇小說(shuō)
這是引用同一個(gè)對(duì)象的簡(jiǎn)單問(wèn)題。
為了證明這一點(diǎn),比較兩個(gè)對(duì)象
console.log(firstResultUsing === secondResultUsing)
你會(huì)看到它打印true證明它們都引用了同一個(gè)對(duì)象。
向下滾動(dòng)以獲取解決方案!
長(zhǎng)篇大論
在這一行:
const userEmailUsingGenerateSchemaField = generateSchemaField({
user_email: {
type: 'string',
description: 'A user email',
},
})
這里發(fā)生的事情是你的generateSchemaField函數(shù)正在返回一個(gè)函數(shù),它有一個(gè)閉包,obj它只是
{
user_email: {
type: 'string',
description: 'A user email',
},
}
現(xiàn)在在這一行:
const firstResultUsing = userEmailUsingGenerateSchemaField()
該函數(shù)被評(píng)估并返回修改后的對(duì)象
{
user_email: {
type: 'string',
description: 'A user email',
required: false
},
}
記住返回的對(duì)象仍然具有相同的引用 obj
現(xiàn)在再次在線(xiàn):
const secondResultUsing = userEmailUsingGenerateSchemaField(true)
這里發(fā)生的事情obj是修改了相同的引用對(duì)象,并使用屬性更新了它required: true
這就是為什么當(dāng)你們console.log都在展示時(shí),required: true因?yàn)樗麄兌家昧送粋€(gè)對(duì)象。
解決方案
const generateSchemaField = obj => {
return function(required = false) {
const objClone = JSON.parse(JSON.stringify(obj));
Object.keys(objClone).forEach(key => {
Object.assign(objClone[key], {
required,
});
});
return objClone;
};
};
讓我們分解一下。我刪除了,obj = Object.assign({}, obj);因?yàn)樗鼪](méi)有任何好處。這似乎是一條多余的線(xiàn)。
接下來(lái),我做了一個(gè)深克隆的obj。記住Object.assign不會(huì)工作,因?yàn)樗皇莿?chuàng)建一個(gè)淺拷貝/克隆,在這里它不會(huì)工作,因?yàn)殒Iemail_id持有對(duì)對(duì)象的引用。請(qǐng)注意,深度克隆JSON.parse(JSON.stringify(obj))僅適用于具有 JSON 安全值(無(wú)函數(shù)undefined等)的對(duì)象。
然后,我操作這個(gè)克隆的對(duì)象并返回它。現(xiàn)在不存在操作相同引用對(duì)象的威脅。
如果這有幫助,或者您需要更好的解釋?zhuān)?qǐng)告訴我。
添加回答
舉報(bào)