精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美tk—视频vk| 亚洲美女在线国产| 欧美在线视频网站| 国产日韩精品中文字无码| 四虎永久精品在线| 亚洲一区二区三区在线看| 精品国产一区二区三区四区vr| 欧美性猛交bbbbb精品| 日韩av在线播放网址| 日韩欧美一区二区视频| 免费黄色福利视频| 黄a在线观看| av在线播放不卡| 国产精品一区二区三区免费视频| 欧美极品aaaaabbbbb| 综合色就爱涩涩涩综合婷婷| 欧美精品色综合| 成人免费观看cn| 看女生喷水的网站在线观看| aaa欧美色吧激情视频| 国产精品午夜视频| 欧美啪啪小视频| 欧美激情第二页| 亚洲精品一区二区久| 性生活在线视频| 久久精品嫩草影院| 日本韩国精品在线| 少妇大叫太大太粗太爽了a片小说| 国产精品影院在线| 99视频在线观看一区三区| 91免费国产视频| 91视频在线视频| 999在线观看精品免费不卡网站| 久久久精品一区二区| 黄免费在线观看| 欧美午夜寂寞| 精品久久久久av影院 | 秋霞午夜鲁丝一区二区老狼| 午夜精品在线视频| 久久精品一区二区三| 亚洲欧洲美洲一区二区三区| 伊人精品在线观看| 久久只有这里有精品| 色先锋久久影院av| 日韩av在线一区| 亚洲欧美日韩色| 一区二区三区欧洲区| 日韩一卡二卡三卡四卡| 国产三级生活片| www.久久热| 在线播放欧美女士性生活| 黄色小视频免费网站| 久久伊人国产| 欧美在线观看视频一区二区三区| 国产欧美在线一区| 成人性生活av| 一本大道av伊人久久综合| 欧美日韩第二页| 国产精品专区免费| 色噜噜狠狠成人中文综合| 毛片av免费在线观看| 欧美www.| 欧美色区777第一页| 日本不卡一区二区在线观看| 国产激情一区| 欧美成人精品3d动漫h| 日本一级大毛片a一 | 亚洲春色在线| 欧美成人xxx| 亚洲人成网站在线| 国产成人永久免费视频| а√天堂8资源在线| 欧美色另类天堂2015| 黄色片视频在线播放| 高清av一区| 91精品国产综合久久精品性色| 91免费视频污| 成人香蕉社区| 亚洲社区在线观看| 黄色精品视频在线观看| 欧美日韩亚洲国产精品| 97在线日本国产| 精品久久久久久久久久久久久久久久久久| 日韩成人免费电影| 92看片淫黄大片看国产片| 开心激情综合网| 久久久久久免费网| 伊人久久青草| 岛国av在线播放| 欧美影视一区二区三区| 性色av浪潮av| 免费国产自久久久久三四区久久| 深夜福利日韩在线看| 免费在线黄色片| 久久婷婷丁香| 99电影在线观看| 精品99又大又爽又硬少妇毛片| 中文字幕一区二区不卡| 蜜臀av无码一区二区三区| 日韩av超清在线观看| 日韩精品一区在线观看| 先锋影音av在线| 欧美亚洲不卡| 国产精选久久久久久| 人成网站在线观看| 亚洲欧美一区二区视频| 无码精品a∨在线观看中文| 四虎国产精品成人免费影视| 亚洲第一福利在线观看| 免费成人深夜蜜桃视频| 一二三区精品| www.成人av.com| 91精彩视频在线播放| 亚洲成年人影院| 中文字幕第一页在线视频| 羞羞色国产精品网站| 欧美xxxx做受欧美.88| 中文字幕永久在线| 91欧美一区二区| 日本国产中文字幕| 四虎视频在线精品免费网址| 亚洲欧洲黄色网| 日韩三级小视频| 国产高清不卡一区二区| 亚洲一区二区三区欧美| videos性欧美另类高清| 亚洲国产精品久久久久| 蜜臀久久精品久久久用户群体| 日韩高清不卡在线| 久久久99爱| 国产精品论坛| 亚洲福利视频专区| 国产午夜精品一区二区理论影院 | 精品久久久久久无码人妻| 国产精品久久观看| 国产精品视频专区| 成人激情电影在线看| 一本一道久久a久久精品| 性久久久久久久久久久| 好看的日韩av电影| 99在线影院| 污污网站在线看| 欧美成人aa大片| 久久国产精品二区| 国产成人精品网址| 日韩美女爱爱视频| 成人高潮a毛片免费观看网站| 九九久久久久99精品| 精品久久久无码中文字幕| 伊人一区二区三区| 亚洲熟妇一区二区| 韩国在线一区| 国产一区二区自拍| 韩国精品一区| 亚洲裸体xxxx| 无码人妻丰满熟妇奶水区码| 国产午夜精品一区二区三区嫩草| 免费大片在线观看| 国产一区二区亚洲| 国产一区二区在线免费| 免费黄网在线观看| 日韩欧美一区二区免费| 国产精品99精品| 99re66热这里只有精品3直播 | 国产一区二区美女诱惑| 伊人网在线免费| 国产精品传媒| 欧美性视频精品| jizzjizz在线观看| 91精品欧美综合在线观看最新| 男人与禽猛交狂配| 成人av中文字幕| www.色就是色| 久久久久午夜电影| 国产精品美女黄网| 欧美大片高清| 日韩视频免费观看| 国精产品乱码一区一区三区四区| 精品国产精品自拍| 91麻豆制片厂| 成人免费视频caoporn| 草草久久久无码国产专区| 精品理论电影在线| 91久久精品一区二区别| f2c人成在线观看免费视频| 亚洲人成在线观| 国产a级免费视频| 狠狠躁夜夜躁人人爽超碰91| 开心激情五月网| 成人白浆超碰人人人人| 中文字幕av专区| 亚洲一级特黄| 天天综合狠狠精品| 国产成人在线中文字幕| 国产精品成人av在线| 神马午夜伦理不卡| 亚洲天堂第二页| 亚洲卡一卡二卡三| 欧美视频一区二| 日产精品久久久久| 中文字幕欧美激情| 大尺度做爰床戏呻吟舒畅| 老司机精品视频在线| 国产人妻777人伦精品hd| 欧美日韩水蜜桃| 国产免费高清一区| 最新亚洲国产| 国产成人精品一区二区三区| 亚洲奶水xxxx哺乳期| 一本大道亚洲视频| 天堂在线观看免费视频| 欧美久久婷婷综合色| 精产国品一区二区| 亚洲成人免费电影| 青草影院在线观看| 国产日韩成人精品| a视频免费观看| 国产伦理精品不卡| 亚洲综合婷婷久久| 久热re这里精品视频在线6| av一区二区三区免费观看| 日韩欧美精品综合| 日本成人三级| 夜色77av精品影院| 精品久久久三级| 国产精品一区二区三区美女| 91中文字幕在线观看| 91精品国产66| 国产精品久久久久久久久影视| 深夜成人在线| 海角国产乱辈乱精品视频| av观看在线| 久久久国产视频91| 福利在线播放| 亚洲欧洲在线免费| 男女污污视频在线观看| 日韩精品欧美激情| 香蕉国产在线视频| 日韩成人中文电影| 少妇一区二区三区四区| 亚洲国产精品久久久久秋霞蜜臀 | 精品一区二区男人吃奶| 国产精品久久久久久免费观看 | jizz内谢中国亚洲jizz| 欧美一级大片视频| 鲁鲁在线中文| 欧美在线视频一区| 欧美momandson| 国产成人久久精品| 欧美日韩免费观看视频| 国产精品激情自拍| 欧美一级在线| 91在线视频精品| 少妇精品在线| 黄色91av| 九九久久成人| 亚洲福利av在线| 久久久久久久久丰满| 18视频在线观看娇喘| 午夜国产精品视频| 日韩精品在线中文字幕| 欧美亚洲专区| 国产精品拍拍拍| 黄色资源网久久资源365| 天堂av.com| 成人av网站大全| 偷拍女澡堂一区二区三区| 久久久久久电影| 91视频青青草| 亚洲国产精品自拍| 三级视频在线观看| 欧美日韩不卡一区| 亚洲精品一区二区口爆| 亚洲美女中文字幕| 免费黄色网页在线观看| 欧美第一页在线| 伊人成综合网站| 国产在线精品一区免费香蕉| 久久精品九色| 久久精品二区| 99热国内精品永久免费观看| 成人毛片100部免费看| 国产一区二区三区久久| 性chinese极品按摩| 国产69精品久久99不卡| 欧洲女同同性吃奶| 亚洲色图欧美在线| 制服.丝袜.亚洲.中文.综合懂色| 欧美中文字幕一区| 亚洲av无码片一区二区三区| 日韩精品免费在线视频| 国产精品va在线观看视色| 91av在线精品| 99精品在线免费观看| 久久久久久久久久久久久久久久av | 精品福利一二区| 成人高清在线| 2019中文字幕在线观看| 成人短视频软件网站大全app| 精品日本一区二区三区在线观看| 国产精品黑丝在线播放| 东京热加勒比无码少妇| 国产精品资源网站| 成人无码av片在线观看| 午夜精品久久久久| 国产特级aaaaaa大片| 亚洲欧洲高清在线| 黄色在线网站噜噜噜| 91亚洲永久免费精品| 欧美最新另类人妖| 国产二区视频在线播放| 国产成人亚洲综合a∨婷婷图片| 美国一级黄色录像| 欧美丝袜一区二区| 日韩在线观看视频一区二区三区| 爱福利视频一区| 成人免费黄色| 日本一区二区三区免费看| 最新日韩欧美| 亚洲成人福利视频| 亚洲免费伊人电影| 91成人国产综合久久精品| 亚洲一二三在线| 国产精欧美一区二区三区蓝颜男同| 国产精品亚洲综合| 欧美午夜视频| 欧美精品色视频| 亚洲欧美日韩综合aⅴ视频| 在线免费av片| 一区二区福利视频| 另类中文字幕国产精品| 欧美男人的天堂| 亚洲欧美日韩精品一区二区| 成人午夜精品无码区| 亚洲一区二区三区视频在线| 国产欧美综合视频| 操日韩av在线电影| 精品国产乱码久久久久久樱花| 亚洲一区二区三区精品动漫| 美女在线观看视频一区二区| 天天舔天天操天天干| 在线免费观看日本欧美| 国产中文在线视频| 国产福利成人在线| av一区二区在线观看| 少妇一级淫免费放| 国产精品久久久久影院亚瑟| 久久午夜鲁丝片| 色噜噜狠狠色综合网图区| 久久久久毛片| 免费观看黄色的网站| 精品一区二区免费视频| 中文字幕资源站| 日韩一区二区在线免费观看| av免费在线观看网址| 亚洲jizzjizz日本少妇| 欧美日韩国产探花| 怡红院一区二区| 一本久道久久综合中文字幕| 日韩a在线观看| 国产精品久久久久久久久| 日韩精品一区二区三区免费观看| 亚洲综合欧美在线| 亚洲免费资源在线播放| 人妻无码一区二区三区久久99| 69久久夜色精品国产7777| 国产成人精品三级高清久久91| 99视频在线视频| 亚洲欧洲成人自拍| 日日夜夜精品免费| 国产成人精品网站| 一区二区中文| 亚洲一区二区三区无码久久| 色呦呦一区二区三区| 日本成人在线视频网址| 伊人春色精品| 777一区二区| 亚洲一区二区三区四区五区黄 | 亚洲第一大网站| 国产91|九色| 亚洲区小说区| 亚洲成人手机在线观看| 亚洲成人综合视频| 成人在线播放视频| 91香蕉视频在线下载| 午夜一区在线| av激情在线观看| 亚洲精美色品网站| 色成人综合网| 人妻有码中文字幕| 亚洲视频1区2区| 激情视频在线观看免费| 96国产粉嫩美女| 麻豆久久精品| 免费人成年激情视频在线观看| 亚洲欧美日韩视频一区| 试看120秒一区二区三区| 日av中文字幕| 午夜亚洲国产au精品一区二区| 亚洲欧美视频一区二区|