久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文帶你詳細(xì)了解JavaScript中的深拷貝

一文帶你詳細(xì)了解JavaScript中的深拷貝

前端(vue)入門到精通課程:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

網(wǎng)上有很多關(guān)于深拷貝的文章,但是質(zhì)量良莠不齊,有很多都考慮得不周到,寫的方法比較簡陋,難以令人滿意。本文旨在完成一個完美的深拷貝,大家看了如果有問題,歡迎一起補(bǔ)充完善。

評價一個深拷貝是否完善,請檢查以下問題是否都實(shí)現(xiàn)了:

  • 基本類型數(shù)據(jù)是否能拷貝?

  • 鍵和值都是基本類型的普通對象是否能拷貝?

  • Symbol作為對象的key是否能拷貝?

  • DateRegExp對象類型是否能拷貝?

  • MapSet對象類型是否能拷貝?

  • Function對象類型是否能拷貝?(函數(shù)我們一般不用深拷貝)

  • 對象的原型是否能拷貝?

  • 不可枚舉屬性是否能拷貝?

  • 循環(huán)引用是否能拷貝?

怎樣?你寫的深拷貝夠完善嗎?

深拷貝的最終實(shí)現(xiàn)

這里先直接給出最終的代碼版本,方便想快速了解的人查看,當(dāng)然,你想一步步了解可以繼續(xù)查看文章余下的內(nèi)容:

function deepClone(target) {     const map = new WeakMap()          function isObject(target) {         return (typeof target === 'object' && target ) || typeof target === 'function'     }      function clone(data) {         if (!isObject(data)) {             return data         }         if ([Date, RegExp].includes(data.constructor)) {             return new data.constructor(data)         }         if (typeof data === 'function') {             return new Function('return ' + data.toString())()         }         const exist = map.get(data)         if (exist) {             return exist         }         if (data instanceof Map) {             const result = new Map()             map.set(data, result)             data.forEach((val, key) => {                 if (isObject(val)) {                     result.set(key, clone(val))                 } else {                     result.set(key, val)                 }             })             return result         }         if (data instanceof Set) {             const result = new Set()             map.set(data, result)             data.forEach(val => {                 if (isObject(val)) {                     result.add(clone(val))                 } else {                     result.add(val)                 }             })             return result         }         const keys = Reflect.ownKeys(data)         const allDesc = Object.getOwnPropertyDescriptors(data)         const result = Object.create(Object.getPrototypeOf(data), allDesc)         map.set(data, result)         keys.forEach(key => {             const val = data[key]             if (isObject(val)) {                 result[key] = clone(val)             } else {                 result[key] = val             }         })         return result     }      return clone(target) }
登錄后復(fù)制

1. JavaScript數(shù)據(jù)類型的拷貝原理

先看看JS數(shù)據(jù)類型圖(除了Object,其他都是基礎(chǔ)類型):
一文帶你詳細(xì)了解JavaScript中的深拷貝
在JavaScript中,基礎(chǔ)類型值的復(fù)制是直接拷貝一份新的一模一樣的數(shù)據(jù),這兩份數(shù)據(jù)相互獨(dú)立,互不影響。而引用類型值(Object類型)的復(fù)制是傳遞對象的引用(也就是對象所在的內(nèi)存地址,即指向?qū)ο蟮闹羔槪喈?dāng)于多個變量指向同一個對象,那么只要其中的一個變量對這個對象進(jìn)行修改,其他的變量所指向的對象也會跟著修改(因?yàn)樗鼈冎赶虻氖峭粋€對象)。如下圖:
一文帶你詳細(xì)了解JavaScript中的深拷貝

2. 深淺拷貝

深淺拷貝主要針對的是Object類型,基礎(chǔ)類型的值本身即是復(fù)制一模一樣的一份,不區(qū)分深淺拷貝。這里我們先給出測試的拷貝對象,大家可以拿這個obj對象來測試一下自己寫的深拷貝函數(shù)是否完善:

// 測試的obj對象 const obj = {     // =========== 1.基礎(chǔ)數(shù)據(jù)類型 ===========     num: 0, // number     str: '', // string     bool: true, // boolean     unf: undefined, // undefined     nul: null, // null     sym: Symbol('sym'), // symbol     bign: BigInt(1n), // bigint      // =========== 2.Object類型 ===========     // 普通對象     obj: {         name: '我是一個對象',         id: 1     },     // 數(shù)組     arr: [0, 1, 2],     // 函數(shù)     func: function () {         console.log('我是一個函數(shù)')     },     // 日期     date: new Date(0),     // 正則     reg: new RegExp('/我是一個正則/ig'),     // Map     map: new Map().set('mapKey', 1),     // Set     set: new Set().add('set'),     // =========== 3.其他 ===========     [Symbol('1')]: 1  // Symbol作為key };  // 4.添加不可枚舉屬性 Object.defineProperty(obj, 'innumerable', {     enumerable: false,     value: '不可枚舉屬性' });  // 5.設(shè)置原型對象 Object.setPrototypeOf(obj, {     proto: 'proto' })  // 6.設(shè)置loop成循環(huán)引用的屬性 obj.loop = obj
登錄后復(fù)制

obj對象在Chrome瀏覽器中的結(jié)果:

一文帶你詳細(xì)了解JavaScript中的深拷貝

2.1 淺拷貝

淺拷貝: 創(chuàng)建一個新的對象,來接受你要重新復(fù)制或引用的對象值。如果對象屬性是基本的數(shù)據(jù)類型,復(fù)制的就是基本類型的值給新對象;但如果屬性是引用數(shù)據(jù)類型,復(fù)制的就是內(nèi)存中的地址,如果其中一個對象改變了這個內(nèi)存中的地址所指向的對象,肯定會影響到另一個對象。

首先我們看看一些淺拷貝的方法(詳細(xì)了解可點(diǎn)擊對應(yīng)方法的超鏈接):

方法 使用方式 注意事項
Object.assign() Object.assign(target, ...sources)
說明:用于將所有可枚舉屬性的值從一個或多個源對象分配到目標(biāo)對象。它將返回目標(biāo)對象。
1.不會拷貝對象的繼承屬性;
2.不會拷貝對象的不可枚舉的屬性;
3.可以拷貝 Symbol 類型的屬性。
展開語法 let objClone = { ...obj }; 缺陷和Object.assign()差不多,但是如果屬性都是基本類型的值,使用擴(kuò)展運(yùn)算符進(jìn)行淺拷貝會更加方便。
Array.prototype.concat()拷貝數(shù)組 const new_array = old_array.concat(value1[, value2[, ...[, valueN]]]) 淺拷貝,適用于基本類型值的數(shù)組
Array.prototype.slice()拷貝數(shù)組 arr.slice([begin[, end]]) 淺拷貝,適用于基本類型值的數(shù)組

這里只列舉了常用的幾種方式,除此之外當(dāng)然還有其他

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
欧美一级精品| 国产激情久久| 你懂的网址国产 欧美| 欧美+日本+国产+在线a∨观看| 久久的色偷偷| 影视先锋久久| 国产欧洲在线| 国产精品精品国产一区二区| 国产精品宾馆| 国产伦精品一区二区三区在线播放| 在线观看视频免费一区二区三区| 精品欧美久久| 性欧美69xoxoxoxo| av高清不卡| 欧美www视频在线观看| 久久a爱视频| 国产精品1区| 国产精品videosex极品| 日本中文字幕一区二区视频 | 欧美aaaaaa午夜精品| 日韩高清二区| 日本91福利区| 国产日韩三级| 国产精品一区二区三区www| 91精品国产经典在线观看| 亚洲精品麻豆| 日韩欧美精品一区二区综合视频| 深夜福利亚洲| 欧美日韩xxxx| 国产精品v一区二区三区| 美女性感视频久久| 久久免费精品| 亚洲黄色免费看| 9999国产精品| 电影亚洲精品噜噜在线观看| 偷拍精品精品一区二区三区| 久久久久99| 午夜日韩av| 免费日本视频一区| 亚洲三级网址| 91综合久久爱com| 国产精品毛片久久久| 久久一区国产| 免费污视频在线一区| 午夜视频精品| 亚洲精品三级| 欧美激情精品| 亚洲啊v在线| 999国产精品视频| 中文在线一区| 7m精品国产导航在线| 精品视频免费| 一区二区三区视频免费观看| 欧美日韩视频一区二区三区| 一区免费视频| 在线国产精品一区| 日本一区二区三区中文字幕| 国产丝袜一区| 岛国av在线网站| 午夜精品成人av| 免费视频久久| 国产色99精品9i| 超级白嫩亚洲国产第一| 久久久久国产精品一区三寸| 色88888久久久久久影院| 九九久久婷婷| 亚洲一区二区三区中文字幕在线观看| 日本久久一区| 国产一区二区三区天码| 国户精品久久久久久久久久久不卡 | 日韩av二区| 欧美日韩四区| 国产免费av国片精品草莓男男| 精品久久美女| 午夜欧美视频| 国产亚洲观看| 91一区二区| 蜜桃久久久久久久| 麻豆国产精品视频| 在线成人动漫av| 91精品国产自产观看在线 | 日韩精品免费一区二区三区| 99成人在线| 精品五月天堂| 日韩精品一级二级| 欧美丰满日韩| 日韩高清一区| 欧美韩一区二区| 欧美另类综合| 精品亚洲二区| 欧美国产91| 国产精品香蕉| 欧美日韩激情在线一区二区三区| 蜜臀久久99精品久久一区二区 | 成人久久久久| 青青青国产精品| 99国产精品一区二区| 久久国产精品免费精品3p| 欧美理论视频| 国产一区二区三区视频在线| 免费在线观看成人| 久久黄色影院| 国产欧美三级| 久久国产88| 久久99视频| 中文字幕av亚洲精品一部二部 | 国产欧美一区二区三区精品酒店| 日韩中文字幕一区二区高清99| 国产精选在线| 日韩国产高清在线| 99久久激情| 久久精品国产99国产| 婷婷精品在线| 亚洲国产一区二区三区在线播放| 久久久久久久欧美精品| 欧美日韩一区二区三区不卡视频| 久久精品亚洲人成影院| 国产日产一区| 日韩视频一区二区三区在线播放免费观看| 精品视频自拍| 在线免费观看亚洲| 欧美亚洲国产激情| a日韩av网址| 成人午夜毛片| 免费在线亚洲欧美| 国产视频一区二| 日本一区二区三区中文字幕| 亚洲欧美视频一区二区三区| 欧美1区免费| 久久高清免费| 日韩免费福利视频| 国产欧美日韩综合一区在线播放| 免费成人av在线播放| 热三久草你在线| 国产成人精品999在线观看| 欧美亚洲网站| 久久黄色影视| 欧美日韩夜夜| 欧美亚洲综合视频| 日韩国产欧美在线播放| 亚洲丝袜啪啪| 日韩另类视频| 国精品产品一区| 欧美成人精品午夜一区二区| 国产欧美日韩在线一区二区 | 日韩综合一区二区| 久久国产精品毛片| 亚洲小说欧美另类婷婷| 天堂√中文最新版在线| 精品九九在线| 日韩综合在线| 色网在线免费观看| 中文字幕在线看片| 国产精品不卡| 国产色播av在线| 免费高潮视频95在线观看网站| 国产日产高清欧美一区二区三区| 日本不卡视频一二三区| 日韩欧美精品一区二区综合视频| 日本不卡视频一二三区| 欧美在线不卡| 国产精品手机在线播放| 日韩av成人高清| 国产欧美欧美| 精品无人区麻豆乱码久久久| 国产中文字幕一区二区三区| 日韩伦理一区| 日韩在线观看不卡| 99国产精品| 国产精品**亚洲精品| 久久中文字幕av| 亚洲免费一区三区| 欧美1区2区3| 欧美+亚洲+精品+三区| 亚洲综合中文| 日本不卡免费高清视频在线| 久久福利影视| 国产亚洲字幕| 五月婷婷亚洲| 国产精品主播| 午夜精品一区二区三区国产| 国产精品日本一区二区三区在线 | 欧美理论视频| 国产图片一区| 91成人精品视频| 久久国产三级| 国产综合色产| 国产经典一区| 欧美精品黄色| 久久香蕉网站| 国产精品美女| 日韩成人精品一区| 综合激情在线| 国产中文在线播放| 亚洲精品韩国| 久久久精品久久久久久96 | 国产福利一区二区三区在线播放| 欧美日韩色图| 欧美国产极品| 久久电影一区|