亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js中的深淺拷貝問題簡析

2019-11-19 11:36:28
字體:
來源:轉載
供稿:網友

前言

在開發過程中,偶爾會遇到這種場景,拿到一個數據后,你打算對它進行處理,但是你又希望拷貝一份副本出來,方便數據對比和以后恢復數據。

那么這就涉及到了 JS 中對數據的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,你只是復制了對象數據的引用,并沒有把內存里的值另外復制一份,那么深拷貝就是把值完整地復制一份新的值。

下面這篇文章就對js中的深淺拷貝進行了深入的講解,下面話不多說了,來一起看看詳細的介紹吧

問題描述:

因為在JavaScript中對象在賦值中存儲的是對象的地址(指針),所以會造成對象類型在復制過程中只復制對象的地址,從而導致以下問題

 var people = { name: "小明" }var peoplea = people;peoplea.name = "小白";console.log(peoplea.name)//小白console.log(people.name)//小白

我們本來期望只改變peoplea的name,現在連people的name都改變了。根據情況的不同,可使用深拷貝或淺拷貝來解決。

解決方法:

我們在實現深淺拷貝之前,我們先看一看深、淺拷貝、賦值這三種的區別:

1、賦值

改變新對象時不管第幾層,老對象都會隨著變化。

 var people = { name: "小明", act: ["吃飯","睡覺"]}var people1 = people;//賦值people1.name = "小紅"; people1.act[1] = "打游戲";console.log(people.name);//小紅console.log(people.act);//["吃飯", "打游戲"]

2、淺拷貝

改變新對象第一層基本數據類型時,老對象不變。有子對象時,改變子對象,老對象會隨著變化。

 var people = {  name: "小明",  act: ["吃飯", "睡覺"]}var people1 = Object.assign({}, people);//淺拷貝people1.name = "小紅";people1.act[1] = "打游戲";console.log(people.name);//小明console.log(people.act);// ["吃飯", "打游戲"]

3、深拷貝

不管改變新對象第幾層,老對象都不會隨之改變。

var people = {  name: "小明",  act: ["吃飯", "睡覺"]}var people1 = JSON.parse(JSON.stringify(people));//深拷貝people1.name = "小紅";people1.act[1] = "打游戲";console.log(people.name);//小明console.log(people.act);// ["吃飯", "睡覺"]

總結一下就是:

第一層為基本數據類型 多于一層含有子對象
賦值 新老一起改變 新老一起改變
淺拷貝 新對象改變,老對象不變 新老一起改變
深拷貝 新對象改變,老對象不變 新對象改變,老對象不變

了解完了區別,下面介紹實現深淺拷貝的幾個方法。

一、淺拷貝

1、Object.assign()

官方對這個函數的介紹是:Object.assign() 方法用于將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。實際上就是會把屬性中的簡單數據類型直接復制,而對于對象屬性,只會拷貝地址(指針),上邊介紹區別時用的就是這個;

var people1 = Object.assign({}, people);

需要注意的是,如果對象沒有子對象,Object.assign()實現的就是深拷貝。

2、展開運算符(ES6新增)

var people = {  name: "小明",  act: ["吃飯", "睡覺"]}var people1 = {...people};people1.name = "小紅";people1.act[1] = "打游戲";console.log(people.name);//小明console.log(people.act);// ["吃飯", "打游戲"]

3、自己寫

 var people = {  name: "小明",  act: ["吃飯", "睡覺"] } var people1 = shallowCopy(people); people1.name = "小紅"; people1.act[1] = "打游戲"; console.log(people.name);//小明 console.log(people.act);// ["吃飯", "打游戲"] function shallowCopy(obj) {  var res = {};  for (var index in obj) {  if (obj.hasOwnProperty(index)) {//不復制原型鏈上的屬性   res[index] = obj[index];  }  }  return res; }

二、深拷貝

1、JSON.parse(JSON.stringify(obj))

上邊介紹區別時用的就是這個:

var people1 = JSON.parse(JSON.stringify(people));//深拷貝

這個方法比較簡便但也存在問題

1、不能復制對象中的函數。

2、會忽略對象中的undefind。

2、lodash函數

官方介紹是:lodash是一個一致性、模塊化、高性能的 JavaScript 實用工具庫。官網是
www.lodashjs.com/ ,我推薦用其中的_.cloneDeep(value)方法。

ar objects = [{ "a": 1 }, { "b": 2 }]; var deep = _.cloneDeep(objects);console.log(deep[0] === objects[0]);// => false

還有自己去寫一個遞歸,但是需要考慮的東西較多,不再贅述,也有用jq的$.extend()方法實現的,但是性能不好,這里提一下。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产综合视频在线观看| 亚洲欧美激情一区| 中文字幕自拍vr一区二区三区| 国产成人精品亚洲精品| 欧美大尺度激情区在线播放| 国产精品福利片| 亚洲国产免费av| 91久久久久久国产精品| 国产欧美日韩亚洲精品| 中文字幕久热精品视频在线| 久热精品视频在线免费观看| 精品久久久精品| 综合欧美国产视频二区| 亚洲最新av网址| 亚洲人成伊人成综合网久久久| 91精品啪aⅴ在线观看国产| 永久免费看mv网站入口亚洲| 一区二区三区动漫| 国产成人精品久久亚洲高清不卡| 欧美激情手机在线视频| 日本精品一区二区三区在线播放视频| 国产女同一区二区| 国模gogo一区二区大胆私拍| 久久资源免费视频| 欧美大片大片在线播放| 国产91|九色| 最近免费中文字幕视频2019| 97av在线播放| 大胆人体色综合| 欧洲美女免费图片一区| 精品久久久久久久久久ntr影视| 日韩欧美成人精品| 国产情人节一区| 在线播放日韩精品| 成人性生交大片免费看视频直播| 狠狠色狠狠色综合日日五| 国产91精品黑色丝袜高跟鞋| 久久免费精品日本久久中文字幕| 992tv成人免费视频| 国产精品青草久久久久福利99| 亚洲国产精品推荐| 尤物99国产成人精品视频| 国产日韩欧美日韩大片| 中文字幕欧美精品日韩中文字幕| 久久久av免费| 琪琪第一精品导航| 国产视频精品久久久| 亚洲视频欧美视频| 亚洲一区二区三区视频播放| 精品国模在线视频| 国产精品激情av电影在线观看| 亚洲国产精品999| 一区二区三区视频免费在线观看| 国产精品成人aaaaa网站| 伊人伊成久久人综合网站| 91精品久久久久久久久不口人| 91福利视频在线观看| 日韩一区二区三区xxxx| 日韩精品在线视频观看| 最近2019年日本中文免费字幕| 国产午夜精品全部视频在线播放| 精品久久久久久久久国产字幕| 国产日韩欧美中文| 91精品国产综合久久男男| 亚洲国产精品久久| 91成人在线播放| 色七七影院综合| 亚洲精品视频二区| 国产美女扒开尿口久久久| 亚洲欧美另类自拍| 亚洲国产成人在线视频| 久久视频免费观看| 中文字幕国产精品| 免费成人高清视频| 日韩电影在线观看永久视频免费网站| 亚洲免费一在线| 国产精品毛片a∨一区二区三区|国| 国产日韩中文字幕| 欧美另类高清videos| 91精品国产高清久久久久久| 欧美性猛交xxxx黑人| 国产精品第七十二页| 国产91精品黑色丝袜高跟鞋| 国产精品久久久久久久久久新婚| 亚洲精品电影网| 成人免费高清完整版在线观看| 欧美一级黄色网| 欧美成年人视频| 国产精品一区二区三区毛片淫片| 久久久久久亚洲| 91麻豆国产语对白在线观看| 91精品国产自产在线观看永久| 久久久人成影片一区二区三区| 成人黄色影片在线| 久久综合伊人77777尤物| 亚洲一区二区中文| 国产z一区二区三区| 在线观看日韩视频| 国产一区二区视频在线观看| 欧美日韩黄色大片| 91国内在线视频| 欧美激情中文字幕乱码免费| 久久99久久99精品中文字幕| 欧美性极品少妇精品网站| 国产+成+人+亚洲欧洲| 久久91亚洲人成电影网站| 欧美国产日韩一区二区在线观看| 欧美视频中文字幕在线| 国产亚洲精品美女| 日韩av在线最新| 色偷偷av一区二区三区| 国产免费一区视频观看免费| 日本欧美国产在线| 中国人与牲禽动交精品| 欧美成人亚洲成人| 欧美午夜精品久久久久久久| 欧美成人免费小视频| 夜色77av精品影院| 久久久久久久久网站| 国产精品v片在线观看不卡| 亚洲日本aⅴ片在线观看香蕉| 懂色aⅴ精品一区二区三区蜜月| 久久精彩免费视频| 91久久精品美女高潮| 国产成人精品一区二区在线| 国产精品久久久久久av福利软件| 欧美高清videos高潮hd| 精品久久久久久中文字幕| 久久夜色撩人精品| 成人黄色片在线| 国产一区二区三区视频在线观看| 亚洲精品视频久久| 亚洲精品免费一区二区三区| 精品少妇一区二区30p| 美乳少妇欧美精品| 欧美性色19p| 亚洲成人av片| 色99之美女主播在线视频| 欧美在线性视频| www.久久色.com| 国产婷婷成人久久av免费高清| 精品偷拍一区二区三区在线看| 日韩资源在线观看| 中文字幕亚洲欧美一区二区三区| 欧美日韩裸体免费视频| 亚洲午夜国产成人av电影男同| 久久久久女教师免费一区| 欧美精品日韩三级| 日韩av电影院| 国内揄拍国内精品| 欧美麻豆久久久久久中文| 51ⅴ精品国产91久久久久久| 久久久久久久久久亚洲| 亚洲精品自拍偷拍| 亚洲国产精品字幕| 亚洲成人精品视频在线观看| 91香蕉亚洲精品| 欧美激情视频三区| 高清欧美电影在线| 国产一区二区三区四区福利| 日韩av在线免费播放| 亚洲国产欧美一区二区三区同亚洲| 欧美在线一级va免费观看| 欧美裸体xxxxx|