日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js 对象深拷贝、对象数组深拷贝的几种方法总结

發(fā)布時(shí)間:2023/12/31 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js 对象深拷贝、对象数组深拷贝的几种方法总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫前端的時(shí)候經(jīng)常會(huì)遇到對(duì)象的拷貝,一般我們會(huì)用到深拷貝,深拷貝就是完完整整的將一個(gè)對(duì)象從內(nèi)存中拷貝一份出來,放到另一塊新開辟的內(nèi)存中去。向下面這種賦值是淺拷貝,a、b都是對(duì)同一塊內(nèi)存進(jìn)行引用,a、b哪一個(gè)變量修改對(duì)象的屬性值都會(huì)相互影響??偨Y(jié)一下常用的對(duì)象深拷貝以及數(shù)組對(duì)象的深拷貝。

var a = {id:"",name:""} var b = a;
1. 序列化轉(zhuǎn)成json字符串深拷貝,以及存在的問題
2. Object.assign()深拷貝,以及存在的問題
3. 循環(huán)遞歸深拷貝

一、序列化轉(zhuǎn)成json字符串深拷貝

例:

let source = {"id":1}; //序列化轉(zhuǎn)成json字符串 let jsonStr = JSON.stringify(source) //反序列化為對(duì)象 let target = JSON.parse(jsonStr);

存在的問題:
此方法僅在原對(duì)象包含可序列化值類型且沒有任何循環(huán)引用時(shí)才有效。不可序列化值類型的一個(gè)例子是 Date 對(duì)象 - JSON.parse 只能將其解析為字符串而無法解析回其原始的 Date 對(duì)象

注:
同時(shí)總結(jié)java的序列化
序列化:就是把一個(gè)java對(duì)象轉(zhuǎn)成字節(jié)流
反序列化:就是把字節(jié)流轉(zhuǎn)成java對(duì)象
當(dāng)然序列化不僅僅可以是轉(zhuǎn)成字節(jié)流或者json字符串,還有很多種方式
為什么在java對(duì)象要序列化,什么場(chǎng)景要序列化?
如果沒有序列化,怎么把一個(gè)在內(nèi)存里面的對(duì)象保存到文件里面去,怎么把內(nèi)存的對(duì)象通過網(wǎng)絡(luò)傳輸?shù)搅硪慌_(tái)計(jì)算機(jī)的內(nèi)存去呢?序列化就是把內(nèi)存的對(duì)象轉(zhuǎn)成字節(jié)流或者json字符串等方式進(jìn)行傳輸用的,用在一些保存對(duì)象到文件、網(wǎng)絡(luò)傳輸對(duì)象等io流傳輸對(duì)象的場(chǎng)景。


二、Object.assign()深拷貝

Object.assign() 方法用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象。它將返回目標(biāo)對(duì)象。
基本語法:Object.assign(target, …sources)
例:

var source = {"id":1,name:"lin"}; var target = Object.assign({},source);

這樣就可以把source對(duì)象里面的相同屬性值拷貝到target對(duì)象

存在的問題:
如果要拷貝的對(duì)象source里面的屬性不是基礎(chǔ)類型也是對(duì)象,或者屬性含有對(duì)象數(shù)組,這種方式的拷貝就不會(huì)把source對(duì)象里面的對(duì)象或者數(shù)組對(duì)象進(jìn)行深拷貝
例:

var source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]}; var target = Object.assign({},source);

這時(shí)target里面的屬性list數(shù)組對(duì)象只是淺拷貝source里面的list,還是對(duì)同一塊內(nèi)存的引用
也可以向下面這樣優(yōu)化,循環(huán)list數(shù)組里面的對(duì)象進(jìn)行Object.assign拷貝,添加到一個(gè)新的數(shù)組去,然后再賦值給target.list
例:

let source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]}; let target = Object.assign({},source); //對(duì)象數(shù)組的深拷貝 let newlist = []; for(let i=0;i<target.list.length;i++){let obj = Object.assign({}, target.list[i]);newlist.push(obj); } target.list = newlist;

注:如果對(duì)象里面還含有對(duì)象屬性,而里面的對(duì)象屬性又含有對(duì)象屬性,則這種方式很麻煩不合適。

三、循環(huán)遞歸深拷貝

function deepClone(obj, newObj) {var newObj = newObj || {};for (let key in obj) {if (typeof obj[key] == 'object') {let isArray = Array.isArray(obj[key]);//判斷是否數(shù)組newObj[key] = (isArray == true ? [] : {})deepClone(obj[key], newObj[key]);} else {newObj[key] = obj[key]}}return newObj; }

參考:
網(wǎng)友haogemr的js 深度拷貝的幾種方法

總結(jié)

以上是生活随笔為你收集整理的js 对象深拷贝、对象数组深拷贝的几种方法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99久久视频 | 向日葵视频在线播放 | 亚洲天堂123 | 337p粉嫩色噜噜噜大肥臀 | 精品福利在线视频 | 91人人视频 | 99视频久| 天天操天天做 | 少妇29p | 制服一区| 日韩爽片 | 欧美成人午夜精品免费 | 日本色片网站 | 久久久久久黄色 | 伊人网综合视频 | 黄色av网站在线 | 91蝌蚪91九色白浆 | 护士人妻hd中文字幕 | 色婷婷久久综合中文久久蜜桃av | 欧洲成人在线观看 | 97精品熟女少妇一区二区三区 | 欧美成人精品在线 | 午夜三级影院 | 亚洲精品免费看 | 被灌满精子的波多野结衣 | melody在线高清免费观看 | 国产观看 | 国产又色又爽又高潮免费 | 欧美午夜三级 | 日本一区中文 | 亚洲第一视频在线观看 | 成人免费观看av | www.久操| 日本一区二区三区在线播放 | 亚洲天堂影院 | 亚洲精品福利网站 | 国产乱真实合集 | 久久免| 欧美性生活一区二区三区 | 久久国产美女视频 | 九九热色 | 久久经典视频 | 日欧美女人 | 美女黄免费 | 婷婷狠狠爱 | 国产精品久久国产 | 男人的天堂色 | 色校园 | 色婷婷久久五月综合成人 | 中文在线一区二区三区 | 视频免费在线 | 成人亚洲 | 免费看黄色片视频 | 草草影院在线播放 | 国产欧美综合在线 | 天天澡天天狠天天天做 | 中文字幕在线网址 | 天堂av官网 | 伊人操| 国产午夜激情视频 | 探花视频在线版播放免费观看 | 成人黄色大片在线观看 | 蜜臀av88| 在线视频亚洲 | 日韩一卡二卡三卡 | 成年人香蕉视频 | 91成人免费视频 | 欧美日韩国产中文 | 成年人视频网站 | 亚洲精品韩国 | 黄色无遮挡 | 成人在线观看网址 | 青青免费视频 | 午夜激情四射 | 欧美三级网站在线观看 | 亚洲天堂999 | 99精品欧美一区二区蜜桃免费 | 国产精品成 | 亚洲狠狠婷婷综合久久久久图片 | 久久久蜜桃一区二区 | 日本不卡视频一区二区三区 | 久久精品欧美一区二区三区不卡 | 国产在线青青草 | 公肉吊粗大爽色翁浪妇视频 | 2019天天干天天操 | 一区二区三区在线观看免费 | 中文在线天堂网 | 伊人久久免费 | 91精品国产综合久久久蜜臀 | 国产免费一区二区三区在线观看 | 能看的黄色网址 | 欧美黄色大片免费观看 | 狠狠影院| 黄色免费一级 | 亚洲欧美日韩专区 | 色噜噜狠狠一区二区三区果冻 | 操她视频网站 | 调教一区二区三区 | 日本黄频 |