JavaScript復(fù)制變量三種方法實(shí)例詳解
這篇文章主要介紹了JavaScript復(fù)制變量三種方法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
直接將一個(gè)變量賦給另一個(gè)變量時(shí),系統(tǒng)并不會(huì)創(chuàng)造一個(gè)新的變量,而是將原變量的地址賦給了新變量名。舉個(gè)栗子:
復(fù)制代碼
復(fù)制代碼
let obj = {
a: 1,
b: 2,
};
let copy = obj;
obj.a = 5;
console.log(copy.a);
// Result
// a = 5; // 更改obj的值,copy變量的值也會(huì)改變
復(fù)制代碼
復(fù)制代碼
文章中提到了很多種辦法,本文只選擇了三種普遍的用法并分析了各自的優(yōu)缺點(diǎn),以及什么情況下使用哪種是最好的。
1. 原生方法解決
最簡(jiǎn)單的辦法就是一個(gè)一個(gè)循環(huán)復(fù)制給新的變量。舉栗:
復(fù)制代碼
復(fù)制代碼
function copy(mainObj) {
let objCopy = {}; // objCopy will store a copy of the mainObj
let key;
for (key in mainObj) {
objCopy[key] = mainObj[key]; // copies each property to the objCopy object
}
return objCopy;
}
const mainObj = {
a: 2,
b: 5,
c: {
x: 7,
y: 4,
},
}
console.log(copy(mainObj));
復(fù)制代碼
復(fù)制代碼
缺點(diǎn):
1. objCopy 的Object.prototype 方法與mainObj 會(huì)不一樣,通常情況下我們需要完全一樣的副本時(shí),這個(gè)辦法并不適用。
2. 麻煩而且費(fèi)時(shí)費(fèi)事,代碼無(wú)法重用。
3. 如果原來(lái)的變量中包含Object類(lèi)型,復(fù)制時(shí)還是會(huì)把這個(gè)子變量的索引交給新的變量,并不是創(chuàng)建了新的副本。
2. 深度復(fù)制
利用JSON轉(zhuǎn)換來(lái)復(fù)制變量。先將原先的變量轉(zhuǎn)換為String然后再重新組裝成JSON,這樣會(huì)產(chǎn)生一個(gè)不一樣的副本。
復(fù)制代碼
復(fù)制代碼
let obj = {
a: 1,
b: {
c: 2,
},
}
let newObj = JSON.parse(JSON.stringify(obj));
obj.b.c = 20;
console.log(obj); // { a: 1, b: { c: 20 } }
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object Intact!)
復(fù)制代碼
復(fù)制代碼
缺點(diǎn):
1. 變量很多的時(shí)候非常耗時(shí)耗內(nèi)存。
3. 使用Object.assign()
使用舉例:
復(fù)制代碼
復(fù)制代碼
// circular object
let obj = {
a: 'a',
b: {
c: 'c',
d: 'd',
},
}
obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;
let newObj2 = Object.assign({}, obj);
console.log(newObj2);
復(fù)制代碼
復(fù)制代碼
可以把它封裝成一個(gè)方法:
復(fù)制代碼
// 封裝成方法
// 返回一個(gè)新的變量副本
// get a copy of an object
function getNewObjectOf(src) {
return Object.assign({}, src);
}
復(fù)制代碼
缺點(diǎn):
1. 這個(gè)也是淺復(fù)制(僅復(fù)制頂層的屬性,底層屬性并不復(fù)制)。深層屬性會(huì)同樣返回索引,與原變量分享一個(gè)地址。(看下面栗子)
復(fù)制代碼
復(fù)制代碼
let obj = {
a: 1,
b: {
c: 2,
},
}
let newObj = Object.assign({}, obj);
console.log(newObj); // { a: 1, b: { c: 2} }
obj.a = 10;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 1, b: { c: 2} }
newObj.a = 20;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 20, b: { c: 2} }
newObj.b.c = 30;
console.log(obj); // { a: 10, b: { c: 30} }
console.log(newObj); // { a: 20, b: { c: 30} }
// 注意: 所有變量 的 *。b.c 都等于30; 原因看上面解釋。
復(fù)制代碼
復(fù)制代碼
結(jié)論:
原文中還有很多其他的辦法,但此文僅摘抄出最有用的幾個(gè)。一般不會(huì)用到第一種辦法,如需要復(fù)制的變量有很多層的話(huà),需要用第二種辦法來(lái)復(fù)制,如果變量?jī)H僅包含一層(如json格式的配置信息變量),第三種是最高效的。
再次給出封裝好的方法:
// 封裝成方法// 返回一個(gè)新的變量副本 // get a copy of an object function getNewObjectOf(src) { return Object.assign({}, src); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:jquery選擇器和屬性對(duì)象的操作實(shí)例分析
欄 目:JavaScript
本文標(biāo)題:JavaScript復(fù)制變量三種方法實(shí)例詳解
本文地址:http://mengdiqiu.com.cn/a1/JavaScript/9241.html
您可能感興趣的文章
- 04-02javascript潛力,javascript強(qiáng)大嗎
- 04-02javascript點(diǎn)線(xiàn),點(diǎn)線(xiàn)的代碼
- 04-02javascript移出,js 移入移出
- 04-02javascript替換字符串,js字符串的替換
- 04-02包含javascript舍的詞條
- 04-02javascript匿名,js匿名方法
- 04-02javascript并行,深入理解并行編程 豆瓣
- 04-02javascript警報(bào),JavaScript警告
- 04-02javascript前身,javascript的前身
- 04-02javascript遮蓋,JavaScript遮蓋PC端頁(yè)面


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02javascript點(diǎn)線(xiàn),點(diǎn)線(xiàn)的代碼
- 04-02javascript潛力,javascript強(qiáng)大嗎
- 04-02javascript替換字符串,js字符串的替換
- 04-02javascript移出,js 移入移出
- 04-02包含javascript舍的詞條
- 04-02javascript并行,深入理解并行編程 豆瓣
- 04-02javascript匿名,js匿名方法
- 04-02javascript警報(bào),JavaScript警告
- 04-02javascript遮蓋,JavaScript遮蓋PC端頁(yè)面
- 04-02javascript前身,javascript的前身
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)