国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 一個關于JS操作符in問題引發的探究

一個關于JS操作符in問題引發的探究

2022-02-28 16:44恪愚 js教程

這篇文章主要給大家介紹了一個JS操作符in問題引發的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

事情是這樣的:大家都知道“內存泄露”這回事吧。它有幾個常見的場景:

  • 閉包使用不當引起內存泄漏
  • (未聲明的)全局變量
  • 分離的dom節點
  • (隨意的)控制臺的打印
  • 遺忘的定時器
  • 循環引用

內存泄漏需要重視,它是如此嚴重甚至會導致頁面卡頓,影響用戶體驗!

其中第 3 點引起了我的注意 —— 我當然清楚地知道它說的是比如:“假設你手動移除了某個dom節點,本應釋放該dom節點所占用的內存,但卻因為疏忽導致某處代碼仍對該被移除節點有引用,最終導致該節點所占內存無法被釋放”的情況

  1. <div id="root"
  2.     <div class="child">我是子元素</div> 
  3.     <button>移除</button> 
  4. </div> 
  5. <script> 
  6.     let btn = document.querySelector('button'
  7.     let child = document.querySelector('.child'
  8.     let root = document.querySelector('#root'
  9.      
  10.     btn.addEventListener('click'function() { 
  11.         root.removeChild(child) 
  12.     }) 
  13.  
  14. </script> 

該代碼所做的操作就是點擊按鈕后移除.child的節點,雖然點擊后,該節點確實從dom被移除了,但全局變量child仍對該節點有引用,所以導致該節點的內存一直無法被釋放。

解決辦法:我們可以將對.child節點的引用移動到click事件的回調函數中,那么當移除節點并退出回調函數的執行上文后就會自動清除對該節點的引用,自然也就不會存在內存泄漏的情況了。(這實際上是在事件中實時檢測該節點是否存在,如果不存在則瀏覽器必不會觸發remove函數的執行)

  1. <div id="root"
  2.     <div class="child">我是子元素</div> 
  3.     <button>移除</button> 
  4. </div> 
  5. <script> 
  6.     let btn = document.querySelector('button'
  7.  
  8.     btn.addEventListener('click'function() {   
  9.         let child = document.querySelector('.child'
  10.         let root = document.querySelector('#root'
  11.  
  12.         root.removeChild(child) 
  13.     }) 
  14.  
  15. </script> 

這段代碼很完美么?不。因為它在每次事件觸發后都創建了對child和root節點的引用。消耗了內存(你完全可以想象一些人會狂

點按鈕的情況…)。

其實還有一種辦法:我們在click中去判斷當前root節點中是否還存在child子節點,如果存在,則執行remove函數,否則什么也不做!

這就引發了標題中所說的行為。

怎么判斷?

遍歷?不,太過麻煩!

不知怎的,我突然想到了 for...in 中的 in 操作符,它可以基于原型鏈遍歷對象!

我們來還原一下當時的場景:打開github,隨便找一個父節點,并獲取它:

一個關于JS操作符in問題引發的探究

圖中畫紅框的就是我們要取的父元素,橘紅色框的就是要判斷是否存在的子元素。

  1. let parent=document.querySelector('.position-relative'); 
  2. let child=document.querySelector('.progress-pjax-loader'); 

這里注意,因為獲取到的是dom節點(類數組對象),所以我們在操作前一定要先處理一下:

一個關于JS操作符in問題引發的探究

  1. let p_child=[...parent.children]; 

一個關于JS操作符in問題引發的探究

然后

  1. console.log(child in p_child); 

一個關于JS操作符in問題引發的探究

!!!

為什么呢?(此時筆者還沒有意識到事情的嚴重性)

我想,是不是哪里出了問題,用es6的includes api驗證一下:

  1. console.log(p_child.includes(child)); 

一個關于JS操作符in問題引發的探究

沒錯啊!

再用一般的數組驗證一下:

一個關于JS操作符in問題引發的探究

???

此時,筆者才想起到mdn上查閱一番:

一個關于JS操作符in問題引發的探究

進而我發現:in操作符單獨使用時它檢測的是左側的值(作為索引)對應的值是否在右側的對象內部(屬性 & 原型上)

回到上面的代碼中,我們發現:

一個關于JS操作符in問題引發的探究

這驗證了我們的結論。

很顯然,“子元素”并不等同于“存在于原型鏈上” —— 這又引出了一個知識點:attribute和property的區別!

所以經過一番“折騰”,源代碼還是應該直接這樣寫:

  1. <div id="root"
  2.     <div class="child">我是子元素</div> 
  3.     <button>移除</button> 
  4. </div> 
  5. <script> 
  6.     let btn = document.querySelector('button'
  7.     let child = document.querySelector('.child'
  8.     let root = document.querySelector('#root'
  9.     let r_child = [...root.children] 
  10.      
  11.     btn.addEventListener('click'function() { 
  12.         if(r_child.includes(child)){   // 或者你這里直接判斷child是否為null也可以...吧 
  13.             root.removeChild(child) 
  14.         } 
  15.     }) 
  16.  
  17. </script> 

略顯倉促的結尾

所以,看書學習有時候并不能“不求甚解”~

還要勇于“折騰”,學會“查文檔”[/滑稽臉].

總結

到此這篇關于一個關于js操作符in問題的文章就介紹到這了,更多相關js操作符in問題內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_43624878/article/details/115591008

延伸 · 閱讀

精彩推薦
  • js教程JavaScript實現點擊切換驗證碼及校驗

    JavaScript實現點擊切換驗證碼及校驗

    這篇文章主要為大家詳細介紹了JavaScript實現點擊切換驗證碼及校驗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    棟棟很優秀啊3842021-12-29
  • js教程js實現隨機點名功能

    js實現隨機點名功能

    這篇文章主要為大家詳細介紹了js實現隨機點名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    等待的L先生5082021-12-16
  • js教程使用Webpack構建多頁面程序的實現步驟

    使用Webpack構建多頁面程序的實現步驟

    這篇文章主要介紹了使用Webpack構建多頁面程序的實現步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    Tuzilow9532022-02-17
  • js教程uniapp開發小程序的經驗總結

    uniapp開發小程序的經驗總結

    這篇文章主要給大家介紹了關于uniapp開發小程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    東瓜東瓜5812022-02-25
  • js教程JavaScript點擊按鈕生成4位隨機驗證碼

    JavaScript點擊按鈕生成4位隨機驗證碼

    這篇文章主要為大家詳細介紹了JavaScript點擊按鈕生成4位隨機驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    搬磚大法4522022-01-10
  • js教程原生JS實現音樂播放器

    原生JS實現音樂播放器

    這篇文章主要為大家詳細介紹了原生JS音樂播放器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    奶茶只要半糖3642022-01-07
  • js教程詳解javascript腳本何時會被執行

    詳解javascript腳本何時會被執行

    這篇文章主要介紹了詳解javascript腳本何時會被執行,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    皮卡丘和羊寶貝6792022-01-17
  • js教程原生JS實現pc端輪播圖效果

    原生JS實現pc端輪播圖效果

    這篇文章主要為大家詳細介紹了原生JS實現pc端輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    qq_1519846510202021-12-15
主站蜘蛛池模板: 日韩视频精品 | 午夜影院免费 | 国产精品毛片一区二区 | 一区二区在线电影 | www.亚洲 | 亚洲精品乱码久久久久久久久 | 日韩成人在线电影 | 中文字幕在线观看一区 | 求av网站| 一区在线视频观看 | av在线免费观看一区二区 | 久久久精品免费视频 | 一级做a爰片性色毛片2021 | 日韩在线电影 | 国产免费自拍 | 96成人爽a毛片一区二区 | 中文字幕色站 | 高清国产一区 | 久久久久久99 | 美女超碰 | 日韩激情免费视频 | 亚洲狠狠爱一区二区三区 | 国产一区二区三区视频在线观看 | 樱桃小丸子在线观看 | 中文字幕欧美日韩 | 久久久久久久国产精品 | 午夜男人天堂 | 国产精品日韩欧美 | 在线亚洲不卡 | 免费在线观看黄 | 日本久久精品视频 | 欧美精品91 | 九九热1 | 亚洲国产精品成人女人久久久 | 91在线精品一区二区 | 九九热精品视频在线观看 | 欧美日韩国产一区二区三区 | 在线观看色| av中文字幕在线播放 | 久久久久久久久久久久一区二区 | 久久亚洲一区二区三区四区 |