最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?深拷貝的循環(huán)引用問(wèn)題詳解

 更新時(shí)間:2022年12月27日 15:27:17   作者:是廖一啊  
如果說(shuō)道實(shí)現(xiàn)深拷貝最簡(jiǎn)單的方法,我們第一個(gè)想到的就是?JSON.stringify()?方法,因?yàn)镴SON.stringify()后返回的是字符串,所以我們會(huì)再使用JSON.parse()轉(zhuǎn)換為對(duì)象,這篇文章主要介紹了JavaScript?深拷貝的循環(huán)引用問(wèn)題,需要的朋友可以參考下

如果說(shuō)道實(shí)現(xiàn)深拷貝最簡(jiǎn)單的方法,我們第一個(gè)想到的就是 JSON.stringify() 方法,因?yàn)镴SON.stringify()后返回的是字符串,所以我們會(huì)再使用JSON.parse()轉(zhuǎn)換為對(duì)象,如下代碼:

let obj = { name: 'liaoyi',age: 22,sex: 1}
JSON.parse(JSON.stringify(obj))

但是這種克隆不夠完美,有一個(gè)致命的問(wèn)題無(wú)法解決,就是她一旦遇到循環(huán)引用就會(huì)報(bào)錯(cuò):

let obj = { name: 'liaoyi',age: 22,sex: 1}
JSON.parse(JSON.stringify(obj))
obj.c = obj
console.log(JSON.stringify(obj))

js會(huì)報(bào)錯(cuò),無(wú)法把一個(gè)循環(huán)引用轉(zhuǎn)成 json 格式:

在這種情況下,我們通常想到的是寫(xiě)一個(gè)正兒八經(jīng)的深度克隆方法:

使用傳統(tǒng)方式實(shí)現(xiàn)對(duì)象的深拷貝

function deepClone(obj) {
  const objectMap = new Map();
  const _deepClone = value => {
    const type = typeof value;
    if (type !== 'object' || type === null) {
      return value;
    }
    if (objectMap.has(value)) {
      return objectMap.get(value);
    }
    const result = Array.isArray(value) ? [] : {};

    objectMap.set(value, result);

    for (const [key, _v] of Object.entries(value)) {
      result[key] = _deepClone(value[key]);
      console.log(key, _v);
    }
    return result;
  };
  return _deepClone(obj);
}

使用 MessageChannel 實(shí)現(xiàn)循環(huán)引用對(duì)象的深拷貝

不夠新鮮,我們來(lái)看一個(gè)好玩的 Web API

參考鏈接: MessageChannel

MessageChannel允許我們?cè)诓煌臑g覽上下文,比如window.open()打開(kāi)的窗口或者iframe等之間建立通信管道,并通過(guò)兩端的端口(port1和port2)發(fā)送消息。MessageChannel以DOM Event的形式發(fā)送消息,所以它屬于異步的宏任務(wù)。

// 通過(guò)這個(gè)構(gòu)造函數(shù),創(chuàng)建一個(gè)消息通道,它會(huì)返回一個(gè)對(duì)象,解構(gòu) port1, port2 來(lái)實(shí)現(xiàn)通信
const { port1, port2 } = new MessageChannel();
port1.postMessage('hello')
port2.onmessage = msg => {
  console.log(msg.data)  // hello
}

我們可以利用這個(gè)API,實(shí)現(xiàn)循環(huán)引用對(duì)象的深拷貝:

 function deepClone(obj) {
  return new Promise(resolve => {
    const { port1, port2 } = new MessageChannel();
    port1.postMessage(obj);

    port2.onmessage = msg => {
      resolve(msg.data);
      // console.log(obj, msg.data === obj); // false
    };
  })
}

 const obj = { a: 1, b: '2' }
 obj.c = obj; 
 deepClone(obj).then(res =>{
  console.log('res',res);
 })

到此這篇關(guān)于JavaScript 深拷貝的循環(huán)引用問(wèn)題 _的文章就介紹到這了,更多相關(guān)JavaScript 深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript頁(yè)面倒計(jì)時(shí)功能完整示例

    JavaScript頁(yè)面倒計(jì)時(shí)功能完整示例

    這篇文章主要介紹了JavaScript頁(yè)面倒計(jì)時(shí)功能,結(jié)合完整實(shí)例形式分析了javascript計(jì)時(shí)器、時(shí)間運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • Js控制滑輪左右滑動(dòng)實(shí)例

    Js控制滑輪左右滑動(dòng)實(shí)例

    這篇文章主要介紹了Js控制滑輪左右滑動(dòng)實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • Javascript將JSON日期格式化

    Javascript將JSON日期格式化

    在做項(xiàng)目中,將實(shí)體轉(zhuǎn)化為JSON后,結(jié)果后臺(tái)返回json時(shí)間格式為/Date(1306418993027)/,在前臺(tái)JS里顯示的并不是真正的日期,而且我們不能把所有日期字段都變成string吧,因此寫(xiě)了Javascript的擴(kuò)展方法,來(lái)實(shí)現(xiàn)這個(gè)功能,代碼如下
    2016-08-08
  • JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程

    JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程

    本篇文章主要介紹了JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • JavaScript

    JavaScript"模擬事件"的注意要點(diǎn)詳解

    今天小編就為大家分享一篇關(guān)于JavaScript"模擬事件"的注意要點(diǎn)詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 清除輸入框內(nèi)的空格

    清除輸入框內(nèi)的空格

    本文主要分享了js實(shí)現(xiàn)清除輸入框內(nèi)的空格的代碼,代碼簡(jiǎn)單易懂,需要的朋友一起來(lái)看下吧
    2016-12-12
  • CocosCreator Typescript制作俄羅斯方塊游戲

    CocosCreator Typescript制作俄羅斯方塊游戲

    目前關(guān)于cocos開(kāi)發(fā)俄羅斯方塊的文章幾乎寥寥無(wú)幾,因此本文將主要介紹如何通過(guò)CocosCreator Typescript制作簡(jiǎn)單的俄羅斯方塊游戲,代碼具有一定價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • js實(shí)現(xiàn)二級(jí)菜單漸隱顯示

    js實(shí)現(xiàn)二級(jí)菜單漸隱顯示

    這篇文章主要介紹了js制作導(dǎo)航菜單實(shí)現(xiàn)二級(jí)菜單漸隱顯示,感興趣的小伙伴們可以參考一下
    2015-11-11
  • js與jquery獲取父級(jí)元素,子級(jí)元素,兄弟元素的實(shí)現(xiàn)方法

    js與jquery獲取父級(jí)元素,子級(jí)元素,兄弟元素的實(shí)現(xiàn)方法

    本篇文章主要是對(duì)js與jquery獲取父級(jí)元素,子級(jí)元素,兄弟元素的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • Javascript訪問(wèn)Promise對(duì)象返回值的操作方法

    Javascript訪問(wèn)Promise對(duì)象返回值的操作方法

    這篇文章介紹了如何在JavaScript中使用Promise對(duì)象來(lái)處理異步操作,通過(guò)使用fetch()方法和Promise對(duì)象,我們可以從后端API獲取數(shù)據(jù)并處理返回值,文章展示了如何使用.then()鏈?zhǔn)讲僮骱蚢sync/await語(yǔ)法來(lái)訪問(wèn)Promise對(duì)象的返回值,感興趣的朋友一起看看吧
    2025-03-03

最新評(píng)論

潍坊市| 边坝县| 灵武市| 监利县| 桂阳县| 静安区| 香港 | 昔阳县| 且末县| 许昌市| 上蔡县| 山丹县| 肇东市| 滨州市| 罗甸县| 大庆市| 延庆县| 闽侯县| 嘉黎县| 宜黄县| 兴业县| 维西| 义马市| 上犹县| 阜城县| 铜川市| 遂平县| 宁陵县| 波密县| 东莞市| 丰原市| 颍上县| 巴南区| 桐梓县| 保德县| 岳普湖县| 修武县| 新龙县| 双辽市| 宣威市| 长兴县|