4 回答

TA貢獻1836條經(jīng)驗 獲得超13個贊
var unchangedListings = listings;
這意味著,unchangedListings
正在指示 的值listings
,因此如果您更改該unchangedListings
值,則意味著您也在更新listings
。
為了防止這種情況,您需要克隆該值。您應(yīng)該深度克隆該對象。
var currentLowestSeller = JSON.parse(JSON.stringify(listings[0]))
或者
var currentLowestSeller = Object.assign({}, listings[0])

TA貢獻1776條經(jīng)驗 獲得超12個贊
問題的根源
您看到的行為對于大多數(shù)語言來說都是常見的,與 javascript 無關(guān)。
數(shù)組僅包含對其所包含對象的引用。從數(shù)組(或與此相關(guān)的對象)中提取鍵不會復制該鍵的值。如果是這種情況,就無法對程序的狀態(tài)進行任何更改。
var a = { toto: 1 }; // create object
var b = a; // b is pointing the the same object
b['toto'] = 2; // update the object (there is only one)
console.log(a == b); // true because a and b are the SAME object (not just equal,
// both a and b point to the same place in the computer memory)
console.log(a); // { toto: 2 } both objects have been edited
如果需要操作一個對象而不修改原始對象,則需要顯式地創(chuàng)建一個副本。
但是,當使用嵌套對象或嵌套數(shù)組時會出現(xiàn)問題。您需要“深拷貝”還是“淺拷貝”?
淺拷貝
淺復制意味著僅復制“第一層”。
var a = { toto: 1, tata: { tutu: 1 } };
var b = { ... a }; // make a "shallow copy"
// We change "b", did "a" change? => No
b.toto = 2;
console.log(a); // { toto: 1, tata: { tutu: 1 } }
// "a" was not modified!
console.log(b); // { toto: 2, tata: { tutu: 1 } }
// "b" was modified!
// we change a nested object in "b", did "a" change? => Yes
b.tata.tutu = 2;
console.log(a); // { toto: 1, tata: { tutu: 2 } }
// "a" was modified!
console.log(b); // { toto: 2, tata: { tutu: 2 } }
// "b" was modified!
深拷貝
深層復制將復制所有嵌套數(shù)組和對象(并且會帶來顯著的性能成本)。
Javascript 沒有內(nèi)置執(zhí)行深拷貝的語言,因為它不是常見的操作,而且成本高昂。
執(zhí)行對象深層復制的最常見方法是使用 JSON 內(nèi)置函數(shù),但許多方法存在不同的優(yōu)缺點(例如,使用 JSON 內(nèi)置函數(shù)速度很快,但如果對象包含 或 實例,則會中斷NaN)Date。
var a = { toto: 1, tata: { tutu: 1 } };
var b = JSON.parse(JSON.stringify(a)); // make a "deep copy"
// a and b are now completely different, they share nothing in memory
// we can edit any subobject, they will not be any consequence between them.
a.tata.tutu = 2;

TA貢獻1865條經(jīng)驗 獲得超7個贊
如果列表或字典是嵌套的,您可以使用Ramda 庫clone
中的內(nèi)容:
import { clone } from 'ramda';
var currentLowestSeller = clone(listings[0]);

TA貢獻1848條經(jīng)驗 獲得超2個贊
Javascript(以及許多其他語言)最重要的概念之一是引用類型的概念。Javascript 有 3 種通過引用傳遞的數(shù)據(jù)類型:Array
、Function
和Object
。
在你的情況下:
var?unchangedListings?=?listings;?//?still?points?to?listings var?currentLowestSeller?=?listings[0];?//?changes?listings
在改變數(shù)組之前復制數(shù)組始終是一個好習慣:
const?currentLowestSeller?=?[...?listings];?//?currentLowestSeller?points?to?a?new?array
添加回答
舉報