久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
欧美日韩伊人| 日本va欧美va瓶| 久久不见久久见国语| 日本不卡高清| 亚洲欧洲日韩精品在线| 亚洲精品第一| 国产精品欧美大片| 国产精品不卡| 久久夜夜操妹子| 99国产精品自拍| 亚洲精品无播放器在线播放| 日韩激情网站| 国产成人精品一区二区三区免费 | 亚洲国产综合在线看不卡| 亚洲成人一区| 日韩精品中文字幕一区二区| 精品无人区麻豆乱码久久久| 婷婷激情一区| 国产一区导航| 日本va欧美va精品发布| 久久亚洲资源中文字| 久久精品二区三区| 亚洲午夜国产成人| 红杏一区二区三区| 在线视频日韩| 欧美黑人巨大videos精品| 日韩久久精品| 亚洲精品第一| 国产精品高颜值在线观看| 日韩网站在线| 国产亚洲精品美女久久| 日韩成人亚洲| 日本国产亚洲| 日韩另类视频| 欧美亚洲一级| 成人日韩在线观看| 91精品国产一区二区在线观看| 日本久久综合| 日韩欧乱色一区二区三区在线| 激情综合婷婷| 亚洲精选久久| 99精品电影| 国产丝袜一区| japanese国产精品| 麻豆国产精品| 伊人久久一区| 999久久久国产精品| 国产欧美亚洲一区| 欧美二区视频| 国产精品18| 免费在线观看一区二区三区| 91日韩在线| 91成人精品观看| 在线亚洲精品| 麻豆精品蜜桃| 国产极品一区| 爽爽淫人综合网网站| 神马久久午夜| 欧美日本精品| 蜜臀精品久久久久久蜜臀| 日韩欧美另类一区二区| 国产精品第一国产精品| 亚洲三区欧美一区国产二区| 日韩欧美国产精品综合嫩v| 日本午夜精品视频在线观看| 国产精品腿扒开做爽爽爽挤奶网站| 精品久久97| 国产欧美日韩综合一区在线播放| 中文不卡在线| 亚洲男女av一区二区| 久久久久久一区二区| 91成人在线网站| 亚洲久久视频| 制服诱惑一区二区| 欧美影院三区| 四虎884aa成人精品最新| 精品视频网站| 国产精品久一| 日韩精品午夜视频| 中文一区一区三区免费在线观 | 午夜欧美精品久久久久久久| 成人小电影网站| 超碰在线99| 最近高清中文在线字幕在线观看1| 免费看一区二区三区| 国产精品免费99久久久| 国产麻豆精品| 国产精品欧美在线观看| 国产精品毛片视频| 天堂va在线高清一区| 日韩精品一区第一页| 99视频+国产日韩欧美| 欧美亚洲国产激情| 欧美日韩免费观看一区=区三区| 蜜桃成人精品| 99国产精品一区二区| 久久在线视频免费观看| 99成人超碰| 精品一区在线| 黄色av一区| 蜜臀精品久久久久久蜜臀 | 午夜亚洲福利在线老司机| 婷婷激情图片久久| 日韩一级不卡| 一区二区国产在线观看| 亚洲欧洲av| 日本视频一区二区| 国产精品玖玖玖在线资源| 麻豆国产欧美日韩综合精品二区| 精品视频高潮| a日韩av网址| 不卡在线一区二区| 爽爽淫人综合网网站| 亚洲精品美女91| 91精品国产经典在线观看| 欧美黄页在线免费观看| 国产成人在线中文字幕| 久久久久国产| 亚洲一区亚洲| 亚洲精品护士| 国产精品视频一区二区三区综合| 免费一级欧美在线观看视频 | 国产aⅴ精品一区二区三区久久| 日韩激情一区| 视频一区欧美精品| 国产精品午夜av| 欧洲av一区二区| 亚洲精品系列| 国产一区不卡| 国产精品社区| 国产欧美一区二区三区精品观看 | 蜜臀a∨国产成人精品| 欧美一区不卡| 日本在线精品| 亚洲精品伊人| 红杏一区二区三区| 亚洲神马久久| 国产精品黄色| 99视频在线精品国自产拍免费观看| 色狠狠一区二区三区| 精品伊人久久| 三级一区在线视频先锋| 精品女同一区二区三区在线观看| 999精品在线| 国产私拍福利精品视频二区| 影视先锋久久| 国产精品66| 麻豆久久精品| 最新中文字幕在线播放| 免费成人性网站| 成人精品视频| 午夜性色一区二区三区免费视频| 国产日韩电影| 国产午夜久久av| 亚洲综合不卡| 日韩免费在线| 国产精品亚洲产品| 9色精品在线| 九九九精品视频| 免费人成网站在线观看欧美高清| 成人精品国产亚洲| 日韩精品高清不卡| 亚洲精品一区二区在线看| 久久久久亚洲精品中文字幕| 亚洲欧美日韩一区在线观看| 福利一区二区| 国产亚洲精品精品国产亚洲综合| 91九色精品| 首页国产精品| 国产欧美亚洲精品a| 麻豆久久精品| 久久麻豆精品| 国产va免费精品观看精品视频| 亚洲在线久久| 欧美99久久| 国产成人久久| 国产精品99久久久久久董美香| 人人精品人人爱| 欧美精品一区二区久久| 精品一二三区| 国产欧美三级| 日韩欧美中文字幕一区二区三区| 免费久久久久久久久| 一本大道色婷婷在线| 国产精品宾馆| 日韩va亚洲va欧美va久久| 视频在线观看一区二区三区| 性欧美69xoxoxoxo| 日韩毛片视频| 98精品久久久久久久| 狂野欧美性猛交xxxx| 91精品国产自产在线丝袜啪| 三级一区在线视频先锋| 日韩一区二区免费看| 欧美日韩国产在线观看网站| 91精品国产福利在线观看麻豆| 97精品中文字幕| caoporn视频在线| 国产69精品久久| 精品国产18久久久久久二百|