第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我執(zhí)行“x=y”并更改“x”后,它也會更改“y”。我該如何防止這種情況?

當我執(zhí)行“x=y”并更改“x”后,它也會更改“y”。我該如何防止這種情況?

吃雞游戲 2023-09-21 17:09:28
例如我有l(wèi)istings數(shù)組:[ { name: 'bob', price: '10' }, { name: 'jack', price: '12' } ]我正在嘗試找到最低賣家并稍后使用它的數(shù)據(jù)。我愿意var currentLowestSeller = listings[0];現(xiàn)在currentLowestSeller是:{ name: 'bob', price: '10' }后來我做了更改,currentLowestSeller但我不想listings更改主數(shù)組。我currentLowestSeller.price = currentLowestSeller.price * 0.5;這樣做了,這個列表數(shù)組看起來像這樣:[ { name: 'bob', price: 5 }, { name: 'jack', price: '12' } ]我該如何防止這種情況?如果你想重新創(chuàng)建它,只需運行以下代碼:var listings = [];var name1 = 'bob';var name2 = 'jack';var price1 = '10';var price2 = '12';listings.push({  name: name1,  price: price1})listings.push({  name: name2,  price: price2})var currentLowestSeller = listings[0];currentLowestSeller.price = currentLowestSeller.price * 0.5;console.log(listings);我嘗試過的:我嘗試在執(zhí)行任何操作之前創(chuàng)建數(shù)組的副本listings。var unchangedListings = listings;var currentLowestSeller = listings[0];currentLowestSeller.price = currentLowestSeller.price * 0.5;console.log(unchangedListings);但這沒有用。后來我決定這const unchangedListings = listings;會有所幫助。但由于某種原因,它也會更改定義為常量的值。
查看完整描述

4 回答

?
開心每一天1111

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])


查看完整回答
反對 回復 2023-09-21
?
叮當貓咪

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;


查看完整回答
反對 回復 2023-09-21
?
莫回無

TA貢獻1865條經(jīng)驗 獲得超7個贊

如果列表或字典是嵌套的,您可以使用Ramda 庫clone中的內(nèi)容:


import { clone } from 'ramda';


var currentLowestSeller = clone(listings[0]);



查看完整回答
反對 回復 2023-09-21
?
慕尼黑5688855

TA貢獻1848條經(jīng)驗 獲得超2個贊

Javascript(以及許多其他語言)最重要的概念之一是引用類型的概念。Javascript 有 3 種通過引用傳遞的數(shù)據(jù)類型:Array、FunctionObject。

在你的情況下:

var?unchangedListings?=?listings;?//?still?points?to?listings
var?currentLowestSeller?=?listings[0];?//?changes?listings

在改變數(shù)組之前復制數(shù)組始終是一個好習慣:

const?currentLowestSeller?=?[...?listings];?//?currentLowestSeller?points?to?a?new?array


查看完整回答
反對 回復 2023-09-21
  • 4 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號