我通過改變屬性值來玩弄 JavaScript 物件并找到這個觀察結果。
問題陳述:我在一個函式中改變一個物件屬性值并回傳該物件,但不知何故它保留了以前的值并且沒有給出更新的值。
const obj = { prop: 5 }
const mutatingObjectFunction = () => {
let temp = obj.prop;
obj.prop = 10;
return temp;
}
console.log(mutatingObjectFunction()); // 5
為什么它回傳 5 而不是 10?
如果我將直接將物件而不是其屬性分配給臨時變數,那么它會給我更新的值。
const obj = { prop: 5 }
const mutatingObjectFunction = () => {
let temp = obj;
obj.prop = 10;
return temp;
}
console.log(mutatingObjectFunction().prop); // 10
為什么在變數中傳遞一個整體object或一個物件時這種行為會有所不同?propertytemp
uj5u.com熱心網友回復:
您不能在 JS 中通過參考傳遞原始屬性。所以你傳遞給temp的不是obj.prop,而只是5。
但是,當您傳遞一個物件時,您傳遞的是對同一個物件實體的參考,因此該物件的變異可以反映在對它的所有參考中。
let testObj = [] // Arrays are objects too
let a = {obj : testObj}
let temp = a.obj // temp is now a reference to the same array
a.obj.push(1)
temp.push(2)
console.log(temp)
let a = {obj: {value: 5}} // We use an object, {value: 5}
let temp = a.obj // temp is now a reference to our object
a.obj.value
temp.value
console.log(temp.value) // 7
uj5u.com熱心網友回復:
根據此處的 JavaScript,
let temp = obj;
您或不克隆object您參考的object. 如果你想克隆object你應該使用像這樣的傳播運算子let temp = {...obj};
根據您的第二個示例,您正在參考一個物件。因此,如果您更改了實際物件值,它也會影響參考temp值
但是在第一個示例中,您沒有分配完整object,而是分配了物件的特定值。所以在這里你做出了應對價值let temp = obj.prop;。所以當實際值改變時它不會受到影響
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520866.html
標籤:javascript目的
上一篇:如何將陣列轉換為物件。?
