gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一文帶你詳細了解JavaScript中的深拷貝

一文帶你詳細了解JavaScript中的深拷貝

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

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

評價一個深拷貝是否完善,請檢查以下問題是否都實現了:

  • 基本類型數據是否能拷貝?

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

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

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

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

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

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

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

  • 循環引用是否能拷貝?

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

深拷貝的最終實現

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

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) }
登錄后復制

1. JavaScript數據類型的拷貝原理

先看看JS數據類型圖(除了Object,其他都是基礎類型):
一文帶你詳細了解JavaScript中的深拷貝
在JavaScript中,基礎類型值的復制是直接拷貝一份新的一模一樣的數據,這兩份數據相互獨立,互不影響。而引用類型值(Object類型)的復制是傳遞對象的引用(也就是對象所在的內存地址,即指向對象的指針),相當于多個變量指向同一個對象,那么只要其中的一個變量對這個對象進行修改,其他的變量所指向的對象也會跟著修改(因為它們指向的是同一個對象)。如下圖:
一文帶你詳細了解JavaScript中的深拷貝

2. 深淺拷貝

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

// 測試的obj對象 const obj = {     // =========== 1.基礎數據類型 ===========     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     },     // 數組     arr: [0, 1, 2],     // 函數     func: function () {         console.log('我是一個函數')     },     // 日期     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.設置原型對象 Object.setPrototypeOf(obj, {     proto: 'proto' })  // 6.設置loop成循環引用的屬性 obj.loop = obj
登錄后復制

obj對象在Chrome瀏覽器中的結果:

一文帶你詳細了解JavaScript中的深拷貝

2.1 淺拷貝

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

首先我們看看一些淺拷貝的方法(詳細了解可點擊對應方法的超鏈接):

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

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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲欧洲日产国码无码久久99 | 亚洲理论中文字幕| 国产美女主播在线播放| 伊人国产精品视频| 天天av天天操| 免费看黄色a级片| 日本特黄在线观看| 欧美日韩一级在线| 水蜜桃在线免费观看| 男女激烈动态图| 福利在线一区二区| 超碰成人免费在线| 97av视频在线观看| 999精彩视频| 女人高潮一级片| 99亚洲精品视频| 国产91沈先生在线播放| 欧美精品99久久| 向日葵污视频在线观看| 天天摸天天舔天天操| 成人在线免费观看网址| 18禁裸男晨勃露j毛免费观看| 国产高清av在线播放| 粗暴91大变态调教| 亚洲一二三不卡| 国产freexxxx性播放麻豆| 狠狠干 狠狠操| 国产原创精品在线| 久久av高潮av| 日韩一级免费在线观看| 亚欧美一区二区三区| 国产原创中文在线观看| 国产精欧美一区二区三区白种人| 日韩黄色片在线| 免费观看精品视频| 亚洲第一成肉网| 国产免费黄视频| 樱空桃在线播放| av动漫在线观看| 男同互操gay射视频在线看| 鲁一鲁一鲁一鲁一澡| 性欧美极品xxxx欧美一区二区| 992kp免费看片| 国产精品第12页| 日本美女爱爱视频| 亚洲精品性视频| 成年网站在线免费观看| 国产高清av片| 在线看的黄色网址| 久久成人免费观看| 无码人妻精品一区二区三区99v| 成人在线免费播放视频| 成人免费视频91| 无码日本精品xxxxxxxxx| 不卡中文字幕在线观看| 成人在线免费观看av| 伊人影院综合在线| 欧美在线一区视频| 亚洲欧美日本一区二区三区| 日韩五码在线观看| 亚洲精品国产一区二区三区| 97xxxxx| 久久国产亚洲精品无码| 久久久成人精品一区二区三区| 亚洲娇小娇小娇小| 国产成人久久777777| 成人网站免费观看入口| 2022中文字幕| 天堂…中文在线最新版在线| 福利在线一区二区| 国产va亚洲va在线va| 欧美无砖专区免费| 真实国产乱子伦对白视频| 日韩国产成人无码av毛片| 成人在线观看毛片| 成人一级生活片| 国产欧美久久久久| 日韩五码在线观看| 欧美三级一级片| 久久久精品麻豆| 亚洲综合123| h无码动漫在线观看| 人妻无码久久一区二区三区免费| 美脚丝袜脚交一区二区| 国产精品69久久久| 男人操女人免费软件| 亚洲成人福利在线| 一区二区三区四区免费观看| 成品人视频ww入口| 国产又猛又黄的视频| 异国色恋浪漫潭| 国产老熟妇精品观看| 亚洲一区二区蜜桃| 久久观看最新视频| 91国视频在线| www.成人黄色| 三上悠亚久久精品| 五月激情五月婷婷| 人妻少妇精品无码专区二区| 亚欧激情乱码久久久久久久久| 国产911在线观看| 99视频免费播放| 激情六月天婷婷| 麻豆一区二区三区视频| av在线免费观看国产| 超碰超碰在线观看| 国产深夜男女无套内射| 黄色网络在线观看| 久草在在线视频| 国产精品沙发午睡系列| 少妇熟女一区二区| 国产区二区三区| 黄色一级视频片| 国产激情片在线观看| 亚洲综合欧美激情| 国产xxxxx在线观看| 国产一二三四区在线观看| 亚洲xxxx2d动漫1| 那种视频在线观看| 人人妻人人澡人人爽欧美一区双| 婷婷免费在线观看| 免费看黄色一级大片| 日韩国产欧美亚洲| 国产色一区二区三区| 成年人视频网站免费| 18视频在线观看娇喘| 91蝌蚪视频在线| 热久久久久久久久| 国产三级生活片| 57pao国产成永久免费视频| 亚洲中文字幕无码专区| 日本a在线免费观看| 亚洲 欧美 综合 另类 中字| 肉大捧一出免费观看网站在线播放 | 99999精品视频| 久激情内射婷内射蜜桃| h无码动漫在线观看| 国产成人亚洲综合无码| 日本一级黄视频| 无码av天堂一区二区三区| 欧美在线一区视频| 欧美黑人经典片免费观看| 妞干网在线观看视频| 50度灰在线观看| 东北少妇不带套对白| 草草久久久无码国产专区| 国产视频一区二区三区在线播放 | 在线观看国产一级片| 污污的网站免费| 国产成人生活片| 日日碰狠狠添天天爽超碰97| 日本va中文字幕| 欧美 国产 精品| 国产特级淫片高清视频| 看欧美ab黄色大片视频免费| 男人的天堂最新网址| 成人在线免费观看网址| 日韩激情免费视频| 天天操狠狠操夜夜操| 成年丰满熟妇午夜免费视频| 国产激情片在线观看| 国内外免费激情视频| 最新视频 - x88av| 99精品人妻少妇一区二区 | 妺妺窝人体色www在线小说| av天堂永久资源网| 日韩欧美中文视频| 亚洲精品久久久久久久蜜桃臀| av片中文字幕| 国产av第一区| 在线观看高清免费视频| 欧美一级欧美一级| 亚洲精品无码久久久久久| 日韩a一级欧美一级| 欧美视频第一区| 国产精品igao激情视频| 一区二区三区 日韩| 日韩av在线第一页| 国产精品无码乱伦| 亚洲国产精品三区| 国产黄色激情视频| 亚洲高清av一区二区三区| 激情视频综合网| 国产资源在线视频| www插插插无码免费视频网站| 日本不卡一区在线| 国产成人综合一区| 免费黄色福利视频| av无码久久久久久不卡网站| 自拍一级黄色片| 一区二区三区国产好的精华液| www.欧美日本| av动漫免费看| 国产精品wwwww| 男人天堂999| 中文字幕乱码人妻综合二区三区| wwwwww欧美| 东北少妇不带套对白| 久久久久久久香蕉| 日本高清视频免费在线观看|