精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端開發必備:Maps與WeakMaps在DOM節點管理中的妙用

開發 前端
使用 Maps 和 WeakMaps 可以提高代碼的可讀性和可維護性。將DOM節點與相關數據關聯起來,有助于使代碼更清晰易懂。

這篇文章討論了使用 Maps 和 WeakMaps 處理DOM節點的優勢。Maps 和 WeakMaps 是非常實用的工具,尤其在處理大量DOM節點時,它們發揮著重要作用。

文章作者認為,使用 Maps 和 WeakMaps 處理 DOM 節點有以下幾個優點。首先,它們可以方便地存儲和檢索數據。與其他數據結構相比,Maps和 WeakMaps 可以更簡潔地組織和查找相關數據。其次,它們可以幫助開發者更好地管理內存。當不再需要某個DOM節點時,WeakMaps可以自動釋放與該節點相關的內存,從而提高程序的性能。最后,使用 Maps 和 WeakMaps 可以提高代碼的可讀性和可維護性。將DOM節點與相關數據關聯起來,有助于使代碼更清晰易懂。

下面是正文:

在JavaScript中, 我們經常使用普通的對象來存儲鍵/值數據,它們非常擅長這項工作 - 清晰易讀:

const person = {
 firstName: 'Alex', 
 lastName: 'MacArthur', 
 isACommunist: false
};

但是,當我們開始處理經常被讀取、更改和添加屬性的較大實體時,更傾向于使用 Maps。因為在某些情況下,Map 比對象具有多個優勢,特別是性能問題或插入順序比較重要的情況下。

但最近我特別喜歡使用它們來處理大量的DOM節點。

在閱讀Caleb Porzio最近的博客文章時,我想到了這個想法。在這篇文章中,他正在使用由10,000個表行組成的表格,其中一個可以是“active”。為了管理選擇不同行時的狀態,使用對象作為鍵/值存儲。這是他的一個迭代版本的注釋版本。

import { ref, watchEffect } from 'vue';

let rowStates = {};
let activeRow;

document.querySelectorAll('tr').forEach((row) => {
    // Set row state.
    rowStates[row.id] = ref(false);

    row.addEventListener('click', () => {
        // Update row state.
        if (activeRow) rowStates[activeRow].value = false;

        activeRow = row.id;

        rowStates[row.id].value = true;
    });

    watchEffect(() => {
        // Read row state.
        if (rowStates[row.id].value) {
            row.classList.add('active');
        } else {
            row.classList.remove('active');
        }
    });
});

它使用一個對象作為大型哈希映射表,因此用于關聯值的鍵必須是字符串,因此需要在每個項目上存在唯一的ID(或其他字符串值)。這帶來了一些額外的編程開銷,需要在需要時生成和讀取這些值。

任何對象都可以作為鍵

相反,使用 Map 可以讓我們直接將 HTML 節點作為鍵。因此,該代碼片段最終看起來像這樣:

import { ref, watchEffect } from 'vue';

- let rowStates = {};
+ let rowStates = new Map();
let activeRow;

document.querySelectorAll('tr').forEach((row) => {
- rowStates[row.id] = ref(false);
+   rowStates.set(row, ref(false));

    row.addEventListener('click', () => {
-       if (activeRow) rowStates[activeRow].value = false;
+       if (activeRow) rowStates.get(activeRow).value = false;

        activeRow = row;

-       rowStates[row.id].value = true;
+       rowStates.get(activeRow).value = true;
    });

    watchEffect(() => {
-       if (rowStates[row.id].value) {
+       if (rowStates.get(row).value) {
            row.classList.add('active');
        } else {
            row.classList.remove('active');
        }
    });
});

這里最明顯的好處是我不需要擔心每行存在唯一ID。節點引用本身是唯一的,可以作為鍵。因此,既不需要設置也不需要讀取任何屬性。這更簡單、更具彈性。

讀/寫操作通常更高效

當我們處理更大的數據集時,操作的性能顯著提高。甚至在規范中也有說明 - 必須以保持性能的方式構建 Map,以便隨著項目數量的增加而增長:

Maps must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection.

“Sublinear” 的意思是性能不會隨著 Map 的大小成比例地下降。因此,即使是大型 Map,性能也應該保持相當迅速。

再次強調,沒有必要干擾DOM屬性或通過類似字符串的ID執行查找。每個鍵本身就是一個引用,這意味著我們可以跳過一兩個步驟。

我進行了一些基本的性能測試來確認所有這些。首先,按照Caleb的場景,我在頁面上生成了10,000個 <tr> 元素:

const table = document.createElement('table');
document.body.append(table);

const count = 10_000;
for (let i = 0; i < count; i++) {
  const item = document.createElement('tr');
  item.id = i;
  item.textContent = 'item';
  table.append(item);
}

接下來,我設置了一個模板來測量循環遍歷所有這些行并將一些相關狀態存儲在對象或Map中需要多長時間。我還在 for 循環中運行了同樣的過程多次,然后確定編寫和讀取所需的平均時間。

const rows = document.querySelectorAll('tr');
const times = [];
const testMap = new Map();
const testObj = {};

for (let i = 0; i < 1000; i++) {
  const start = performance.now();

  rows.forEach((row, index) => {
    // Test Case #1  
 // testObj[row.id] = index;
 // const result = testObj[row.id];

 // Test Case #2
 // testMap.set(row, index);
 // const result = testMap.get(row);
  });

  times.push(performance.now() - start);
}

const average = times.reduce((acc, i) => acc + i, 0) / times.length;

console.log(average);

我用不同的行大小運行了這個測試:

圖片

請記住,即使是稍微不同的情況,這些結果也可能會有很大的差異,但總體而言,它們通常符合我的預期。在處理相對較少的項目時,Map 和對象之間的性能是可比的。但隨著項目數量的增加,Map 開始拉開差距。性能的次線性變化開始顯現。

WeakMaps更有效地管理內存

有一個特殊版本的 Map 接口,旨在更好地管理內存 - WeakMap 。它通過保持對其鍵的“弱”引用來實現這一點,因此,如果這些對象鍵中的任何一個不再具有其他地方綁定的引用,則它有資格進行垃圾回收。因此,當不再需要該鍵時,整個條目將自動從 WeakMap 中刪除,從而清除更多內存。它也適用于DOM節點。

為了調整這個,我們將使用 FinalizationRegistry ,它會在你正在觀察的引用被垃圾回收時觸發回調。我們將從幾個列表項開始:

<ul>
  <li id="item1">first</li>
  <li id="item2">second</li>
  <li id="item3">third</li>
</ul>

接下來,我們將把這些項目放入 WeakMap 中,并將 item2 注冊為注冊表監視的對象。我們將其刪除,每當它被垃圾回收時,回調將被觸發,我們將能夠看到 WeakMap 如何發生變化。

但是...垃圾收集是不可預測的,也沒有官方的方法來觸發它,因此為了測試,我們將定期生成一堆對象并將它們保存在內存中。以下是整個腳本:

(async () => {
 const listMap = new WeakMap();

 // Stick each item in a WeakMap.
 document.querySelectorAll('li').forEach((node) => {
  listMap.set(node, node.id);
 });

 const registry = new FinalizationRegistry((heldValue) => {
  // Garbage collection has happened!
  console.log('After collection:', heldValue);
 });

 registry.register(document.getElementById('item2'), listMap);
    
 console.log('Before collection:', listMap);

 // Remove node, freeing up reference!
 document.getElementById('item2').remove();

  // Periodically create a bunch o' objects to trigger collection.
  const objs = [];
  while (true) {
     for (let i = 0; i < 100; i++) {
   objs.push(...new Array(100));
  }

  await new Promise((resolve) => setTimeout(resolve, 10));
 }
})();

在發生任何事情之前,WeakMap 如預期的那樣包含三個項。但是在從DOM中刪除第二項并進行垃圾收集之后,它看起來有點不同

圖片

由于節點引用在DOM中不再存在,整個條目已從 WeakMap 中刪除,從而釋放了更多的內存。這是一個很 nice 功能,有助于使環境的內存更加整潔。

責任編輯:姜華 來源: 大遷世界
相關推薦

2024-11-07 09:08:58

2010-09-08 15:13:09

Node節點Node屬性

2010-09-08 15:16:46

clearCSS

2010-09-09 16:54:05

CSSclear

2024-04-25 08:22:43

AndroidlargeHeap屬性

2022-07-13 09:01:17

前端開發文件處理庫

2023-02-24 14:52:20

Redis存儲開發

2022-02-17 20:34:12

Python短路機制開發

2020-11-26 08:38:57

前端 js 庫vue

2022-01-21 19:00:44

前端JS框架

2023-12-29 09:04:01

前端文件處理庫PDF.js

2019-11-19 16:45:09

Web前端開發編碼原則

2019-03-12 10:38:18

前端開發Nginx

2010-08-30 16:02:06

CSSclear

2021-02-16 08:16:09

適配器模式MybatisJava

2021-04-08 10:40:24

前端工具代碼

2021-04-01 07:52:57

前端開發技術熱點

2024-02-04 09:18:00

Python內存管理垃圾回收

2010-03-10 17:57:54

Python編程語言

2025-01-08 08:30:14

點贊
收藏

51CTO技術棧公眾號

亚洲午夜无码av毛片久久| 91美女高潮出水| 日本一区二区免费视频| 国产在线精彩视频| 久久品道一品道久久精品| 国产97在线观看| 少妇太紧太爽又黄又硬又爽小说| 国产精品成人3p一区二区三区| 亚洲色图欧洲色图| 国产亚洲欧美一区二区三区| 国产成人一级片| 97人人精品| 精品国产免费一区二区三区四区 | 一级特级黄色片| 欧美性猛交xxx高清大费中文| 国产精品欧美一区喷水| 亚洲自拍欧美另类| 男人日女人网站| 91超碰成人| 日韩国产欧美精品在线| 亚洲一级片网站| а√在线天堂官网| 综合欧美一区二区三区| 国产有色视频色综合| 中文字幕在线2018| 亚洲精品三级| 久久久国产视频91| 3d动漫精品啪啪一区二区下载| 亚洲国产aⅴ精品一区二区三区| 一区二区三区高清| 日韩精品一区二区三区四区五区| www.狠狠干| 美女网站在线免费欧美精品| 久久人人爽人人爽人人片av高请| 91精品国自产在线| 另类尿喷潮videofree| 欧美年轻男男videosbes| 老太脱裤让老头玩ⅹxxxx| 黄网站视频在线观看| 国产亚洲精品bt天堂精选| 成人免费自拍视频| 免费av中文字幕| 99热免费精品| 欧美高清videos高潮hd| 久久成人小视频| 欧洲激情综合| 亚洲欧美福利视频| 香港三级日本三级| 一区二区三区视频免费视频观看网站| 日本道色综合久久| 香港三级韩国三级日本三级| 污片视频在线免费观看| 亚洲三级免费观看| 伊人久久大香线蕉精品| 国产在线一二| 久久精品网站免费观看| 免费观看国产成人| 亚洲区小说区图片区| 国产99久久久国产精品免费看| 成人h视频在线观看播放| 精品无码一区二区三区的天堂| 一本不卡影院| 97视频在线观看免费高清完整版在线观看| 岛国毛片在线观看| 午夜精品剧场| 久久在线精品视频| 欧美视频www| 久久久久久美女精品| 日韩三级成人av网| 老熟妇高潮一区二区三区| 欧美freesextv| xxxxxxxxx欧美| 亚洲天堂网av在线| 91成人免费| 色妞一区二区三区| 中文字幕美女视频| 亚洲综合自拍| 欧美激情精品久久久久久| 久久免费视频99| 一区二区三区四区五区精品视频| 91精品国产自产91精品| 国产精品久久久久久久久久久久久久久久久 | 在线观看的av| 国产精品国产三级国产有无不卡 | 亚洲三级av| 精品国产麻豆免费人成网站| 久久久久亚洲AV成人无码国产| 欧美a一欧美| 亚洲视频在线观看视频| 中文字幕乱码av| 午夜久久tv| 91av在线免费观看视频| 日产精品久久久| 亚欧美中日韩视频| 国产女人18毛片水18精品| 国产美女免费看| 成人不卡免费av| 秋霞久久久久久一区二区| 在线看免费av| 亚洲va欧美va人人爽午夜| 久久久久狠狠高潮亚洲精品| 国产在视频一区二区三区吞精| 日韩一本二本av| 懂色av粉嫩av蜜乳av| 欧美视频网址| 欧美国产视频一区二区| 国产无人区码熟妇毛片多| 久久精品国语| 亚洲一区二区三区sesese| 日韩精品视频无播放器在线看 | 欧美精品v国产精品v日韩精品| wwwww在线观看| 国产探花一区在线观看| 久久视频在线免费观看| 久久久久久国产精品视频| 久久久久国产精品午夜一区| 成人女保姆的销魂服务| 日本成人一区| 一区二区三区不卡视频在线观看| 久久精品香蕉视频| 亚洲性视频在线| 亚洲最新中文字幕| 国产精品第一页在线观看| 日韩福利视频导航| 国产精品免费一区二区三区在线观看| 色网站免费观看| 亚洲视频一二三区| 青青视频在线播放| 风间由美一区二区av101| 伊人伊人伊人久久| 国产成人在线观看网站| 国产精品一区专区| 日韩中文一区二区三区| 麻豆免费在线| 日韩女优视频免费观看| 国产精品69久久久久孕妇欧美| 亚洲高清资源| 91九色视频在线观看| 成人在线高清视频| 色婷婷综合久久久久中文| 国产一级免费片| 欧美三区不卡| 成人激情综合网| 川上优的av在线一区二区| 欧美三级免费观看| 国产精品成人99一区无码 | 日本久久一区| 日韩黄色高清视频| 青青操免费在线视频| 丰满放荡岳乱妇91ww| 男人的天堂成人| 欧美一级做a| 色婷婷综合成人av| 国产精品xxxxxx| 欧美经典一区二区| 99草草国产熟女视频在线| 自拍视频一区| 日本高清视频精品| 免费福利在线观看| 午夜在线成人av| 国产高潮失禁喷水爽到抽搐 | 国产丝袜欧美中文另类| 97av视频在线观看| 永久免费精品视频| 欧美大片在线看| 日韩一区二区三区在线观看视频| 亚洲综合一二三区| 午夜福利三级理论电影| 国一区二区在线观看| av噜噜色噜噜久久| av电影在线免费| 精品亚洲aⅴ在线观看| 国产成人精品777777| 国产欧美视频一区二区三区| 色综合手机在线| 91精品啪在线观看国产18| 91免费的视频在线播放| gogo高清在线播放免费| 日韩av在线免费| 久久久久在线视频| 中文字幕av一区二区三区高 | 亚洲欧洲在线免费| 在线观看免费黄色小视频| 国产精品国产成人国产三级| 亚洲无在线观看| 激情欧美一区| 日韩在线播放视频| 欧美一级在线亚洲天堂| 懂色av蜜桃av| 久久99久久久欧美国产| youjizz.com亚洲| 欧美日本三级| 欧美多人爱爱视频网站| 污污的视频网站在线观看| 黄色成人av在线| 亚洲第一视频区| 国产精品夜夜嗨| 日本www在线视频| 欧美日韩在线观看视频小说| 91精品中国老女人| а√天堂中文资源在线bt| 一本色道久久综合狠狠躁篇的优点| 91麻豆一区二区| 亚洲成av人综合在线观看| 99久久精品免费视频| 国产激情一区二区三区四区| 久久久噜噜噜www成人网| 水蜜桃久久夜色精品一区| 国产精品露出视频| 成人福利一区二区| 久久久亚洲天堂| 97超碰国产一区二区三区| 欧美三级蜜桃2在线观看| 欧美日韩在线视频免费播放| 91在线免费视频观看| www.com久久久| 性伦欧美刺激片在线观看| 神马午夜伦理影院| 国内精品视频在线观看| 99在线热播| 亚洲欧洲日韩精品在线| 欧美最猛性xxxx| 伊人在我在线看导航| 在线丨暗呦小u女国产精品| 亚洲精品无码久久久| 欧美三片在线视频观看| 国产系列精品av| 亚洲欧美电影一区二区| 538精品视频| 风间由美一区二区三区在线观看| 黄色在线视频网| 亚洲欧美视频| 久草视频国产在线| 亚洲色图欧美| 亚洲精品9999| 要久久爱电视剧全集完整观看| 97av自拍| 国产日韩在线观看视频| 国产精品免费视频xxxx| 国产精品av一区二区三区 | 免费观看久久久久| 亚洲欧美日韩一区二区在线| 丰满人妻熟女aⅴ一区| 欧美日韩情趣电影| 不卡av电影在线| 欧美性猛交xxxx| 日本免费观看视| 亚洲欧美日韩国产另类专区| 国产又爽又黄无码无遮挡在线观看| 高清久久久久久| 男人女人拔萝卜视频| 国产乱一区二区| 在线观看视频你懂得| 国产又粗又猛又爽又黄91精品| 欧美成人福利在线观看| 亚洲欧美日韩国产| 久久这里只有精品23| 欧美精品九九| 免费看欧美黑人毛片| 激情久久五月| 1024av视频| 美女久久一区| 国产a视频免费观看| 久久精品一区二区三区中文字幕| 欧美黄色免费影院| 国产亚洲永久域名| 人妻少妇被粗大爽9797pw| 亚洲在线观看| aaa毛片在线观看| 久久青草久久| 一级在线免费视频| 激情六月婷婷久久| 无码人妻一区二区三区一| 成人午夜精品在线| 影音先锋黄色资源| 久久精品亚洲精品国产欧美kt∨| 久久久久无码精品国产sm果冻 | 色呦呦网站一区| 中文字幕 人妻熟女| 欧美日韩国产综合一区二区三区| 国产精品sm调教免费专区| 欧美日韩国产天堂| 国产99对白在线播放| 亚洲国产精品美女| 国产三区四区在线观看| 日韩中文字幕免费| 在线看一级片| 3344国产精品免费看| 91伊人久久| 波多野结衣精品久久| 日韩电影在线观看完整免费观看| 麻豆av一区二区| 欧美中文一区二区| 黄瓜视频免费观看在线观看www| 欧美成人高清| 激情综合网婷婷| 精品影视av免费| yjizz视频| 中文字幕精品一区| 国产小视频在线看| 在线观看一区二区视频| 国产又黄又爽视频| 亚洲精品美女在线| 永久免费av在线| 98精品在线视频| 精品久久99| 国产一区免费观看| 99精品美女| 免费看污污视频| 最新成人av网站| 99re精彩视频| 91麻豆国产精品久久| 日韩福利小视频| 黑人巨大精品欧美一区二区三区| 91美女精品网站| 亚洲欧美日韩另类| 91麻豆免费在线视频| 日本精品性网站在线观看| 国产精品一区免费在线| 欧美日韩国产综合视频在线| 艳女tv在线观看国产一区| 亚洲成人av免费看| 国产精品一区一区| 丰满少妇一区二区| 亚洲一区视频在线| 97精品人妻一区二区三区在线| 国产视频久久网| 91av久久| 97se在线视频| 亚洲网色网站| 日日干夜夜操s8| 久久久久国产精品厨房| 国产午夜视频在线播放| 制服丝袜一区二区三区| yw在线观看| 日韩av观看网址| 欧美男人操女人视频| 男女h黄动漫啪啪无遮挡软件| 日韩av成人高清| 黄色av电影网站| 国产精品久久一级| 大吊一区二区三区| 色综合欧美在线视频区| 欧美孕妇孕交| 国产精品久久77777| 国产一区二区三区四区二区| 少妇激情一区二区三区| 欧美激情一区二区三区不卡 | 欧美一区二区精品在线| av小次郎在线| 99三级在线| 红桃视频国产精品| 国产精品扒开腿做爽爽爽a片唱戏| 亚洲一区二区三区四区不卡| 亚洲精品久久久久久久久久久久久久 | 高清一区二区三区视频| 一区免费在线| 国产麻豆天美果冻无码视频| 日韩欧美一区二区在线| 国产黄色免费在线观看| 国产在线日韩在线| 欧美激情四色| 亚洲欧美日本一区| 色域天天综合网| 久cao在线| 成人免费在线一区二区三区| 99精品免费| 国产精品www爽爽爽| 3atv在线一区二区三区| 97超碰免费在线| 日本高清不卡三区| 国内不卡的二区三区中文字幕 | 四虎影成人精品a片| 欧美在线观看一区| 黄色网页在线免费观看| 国产99午夜精品一区二区三区| 国产精品久久久久久久免费软件| 无码少妇精品一区二区免费动态| 欧美二区三区的天堂| 韩国精品一区| 中文字幕一区综合| 成人中文字幕电影| 日本丰满少妇做爰爽爽| 欧美成年人视频| 日韩高清影视在线观看| 超碰成人在线播放| 第一福利永久视频精品| 日本在线人成| 精品一区2区三区| 国内成+人亚洲+欧美+综合在线| 好吊妞视频一区二区三区| 日韩视频免费大全中文字幕| 动漫av一区| 久久久久久久高清| 色一区在线观看| 青青在线视频| 日日夜夜精品网站| 粉嫩一区二区三区性色av| www.久久网| 26uuu久久噜噜噜噜|