日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Javascript前端優化代碼

瀏覽:25日期:2023-10-01 11:43:10
if 判斷的優化

JavaScript條件語句在我們平時的開發中是不可避免要用到的,但是很多時候我們的代碼寫的并不好,一連串的if-else或者多重嵌套判斷都會使得代碼很臃腫,下面舉例進行優化。

需求:現在有 4 個產品,分別是手機、電腦、電視機、游戲機,當然每個產品顯示的價格不一樣。

1、最簡單的方法:if 判斷

let commodity = { phone: ’手機’, computer: ’電腦’, television: ’電視’, gameBoy: ’游戲機’,}function price(name) { if (name === commodity.phone) { console.log(1999) } else if (name === commodity.computer) { console.log(9999) } else if (name === commodity.television) { console.log(2999) } else if (name === commodity.gameBoy) { console.log(3999) }}price(’手機’) // 9999

缺點:代碼太長了,維護和閱讀都很不友好

2、好一點的方法:Switch

let commodity = { phone: ’手機’, computer: ’電腦’, television: ’電視’, gameBoy: ’游戲機’,}const price = (name) => { switch (name) { case commodity.phone: console.log(1999) break case commodity.computer: console.log(9999) break case commodity.television: console.log(2999) break case commodity.gameBoy: console.log(3999) break }}price(’手機’) // 99993、更優的方法: 策略模式

策略模式利用組合、委托和多態等技術和思想,可以有效地避免多重條件選擇語句。它提供了對開放—封閉原則的完美支持,將算法封裝在獨立的 strategy 中,使得它們易于切換,易于理解,易于擴展。

const commodity = new Map([ [’phone’, 1999], [’computer’, 9999], [’television’, 2999], [’gameBoy’, 3999],])const price = (name) => { return commodity.get(name)}price(’phone’) // 1999includes 的優化

includes是 ES7 新增的 API,與indexOf不同的是includes直接返回的是Boolean值,indexOf則 返回的索引值, 數組和字符串都有includes方法。

需求:我們來實現一個身份認證方法,通過傳入身份 Id 返回對應的驗證結果

傳統方法

function verifyIdentity(identityId) { if (identityId == 1 || identityId == 2 || identityId == 3 || identityId == 4) { return ’你的身份合法,請通行!’ } else { return ’你的身份不合法’ }}

includes優化

function verifyIdentity(identityId) { if ([1, 2, 3, 4].includes(identityId)) { return ’你的身份合法,請通行!’ } else { return ’你的身份不合法’ }}for 循環

在 JavaScript 中,我們可以使用for(),while(),for(in),for(in)幾種循環,事實上,這三種循環中for(in)的效率極差,因為他需要查詢散列鍵,所以應該盡量少用。

for 循環是最傳統的語句,它以變量 i 作為索引,以跟蹤訪問的位置,對數組進行操作。

var arr = [’a’, ’b’, ’c’]for (var i = 0; i < arr.length; i++) { console.log(arr[i]) //結果依次a,b,c}

以上的方法有一個問題:就是當數組的長度到達百萬級時,arr.length就要計算一百萬次,這是相當耗性能的。所以可以采用以下方法就行改良。

var arr = [’a’, ’b’, ’c’]for (var i = 0, length = arr.length; i < length; i++) { console.log(arr[i]) //結果依次a,b,c}

此時arr.length只需要計算一次,優化了性能。

for-in一般用來來遍歷對象的屬性的,不過屬性需要enumerable(可枚舉)才能被讀取到。同時for-in也可以遍歷數組,遍歷數組的時候遍歷的是數組的下標值。

var obj = { 0: ’a’, 1: ’b’, 2: ’c’ }for (var key in obj) { console.log(key) //結果為依次為0,1,2}var arr = [’a’, ’b’, ’c’]for (var key in a) { console.log(key) //結果為依次為0,1,2}

for-of語句看著有點像for-in語句,但是和for-of語句不同的是它不可以循環對象,只能循環數組。

var arr = [’a’, ’b’, ’c’]for (var value of arr) { console.log(value) // 結果依次為a,b,c}

for-of比for-in循環遍歷數組更好。for-of只要具有Iterator接口的數據結構,都可以使用它迭代成員。它直接讀取的是鍵值。for-in需要窮舉對象的所有屬性,包括自定義的添加的屬性也能遍歷到。且for-in的key是String類型,有轉換過程,開銷比較大。

所以在開發過程中循環數組盡量避免使用for-in。

數組去重

數組去重是實際開發處理數據中經常遇到的,方法有很多,這里就不一一例舉了。

1、最傳統的方法:利用數組的indexOf下標屬性來查詢。

function unique4(arr) { var newArr = [] for (var i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) { newArr.push(arr[i]) } } return newArr}console.log(unique4([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]))// [1, 2, 3, 5, 6, 7, 4]2、優化:利用 ES6 的Set方法。

Set本身是一個構造函數,用來生成Set數據結構。Set函數可以接受一個數組(或者具有 iterable 接口的其他數據結構)作為參數,用來初始化。Set對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似于數組,但是成員的值都是唯一的,沒有重復的值。

function unique4(arr) { return Array.from(new Set(arr)) // 利用Array.from將Set結構轉換成數組}console.log(unique4([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]))// [1, 2, 3, 5, 6, 7, 4]箭頭函數

箭頭函數表達式的語法比函數表達式更簡潔。所以在開發中更推薦使用箭頭函數。特別是在vue項目中,使用箭頭函數不需要在更this重新賦一個變量。

// 使用functionsvar arr = [5, 3, 2, 9, 1]var arrFunc = arr.map(function (x) { return x * x})console.log(arrFunc)// 使用箭頭函數var arr = [5, 3, 2, 9, 1]var arrFunc = arr.map((x) => x * x)

要注意的是,箭頭函數不綁定arguments,取而代之用rest參數…解決。

// 不能使用 argumentslet fun1 = (b) => { console.log(arguments)}fun1(2, 92, 32, 32) // Uncaught ReferenceError: arguments is not defined// 使用rest 參數let fun2 = (...c) => { console.log(c)}fun2(3, 82, 32, 11323) // [3, 82, 32, 11323]Dom 的創建

創建多個 dom 元素時,先將元素append到DocumentFragment中,最后統一將DocumentFragment添加到頁面。

常規方法;

for (var i = 0; i < 1000; i++) { var el = document.createElement(’p’) el.innerhtml = i document.body.appendChild(el)}

使用DocumentFragment優化多次append

var frag = document.createDocumentFragment()for (var i = 0; i < 1000; i++) { var el = document.createElement(’p’) el.innerhtml = i frag.appendChild(el)}document.body.appendChild(frag)

更優的方法:使用一次innerHTML賦值代替構建 dom 元素

var html = []for (var i = 0; i < 1000; i++) { html.push(’<p>’ + i + ’</p>’)}document.body.innerHTML = html.join(’’)內存泄漏

系統進程不再用到的內存,沒有及時釋放,就叫做內存泄漏(memory leak)。當內存占用越來越高,輕則影響系統性能,重則導致進程崩潰。

引起內存泄漏的原因

全局變量

1、未聲明變量或者使用this創建的變量(this的指向是window)都會引起內存泄漏

function fn() { a = 'Actually, I’m a global variable'}fn()function fn() { this.a = 'Actually, I’m a global variable'}fn()

解決方法:

避免創建全局變量 使用嚴格模式,在 JavaScript 文件頭部或者函數的頂部加上use strict。2、在vue單頁面應用,聲明的全局變量在切換頁面的時候沒有清空

<template> <div id='home'> 這里是首頁 </div></template><script> export default { mounted() { window.test = {// 此處在全局window對象中引用了本頁面的dom對象name: ’home’,node: document.getElementById(’home’) } } }</script>

解決方案: 在頁面卸載的時候順便處理掉該引用。

destroyed () { window.test = null // 頁面卸載的時候解除引用}

閉包

閉包引起的內存泄漏原因:閉包可以維持函數內局部變量,使其得不到釋放。

function fn() { var a = 'I’m a' return function () { console.log(a) }}

解決:將事件處理函數定義在外部,解除閉包,或者在定義事件處理函數的外部函數中,刪除對 dom 的引用。

定時器或事件監聽

由于項目中有些頁面難免會碰到需要定時器或者事件監聽。但是在離開當前頁面的時候,定時器如果不及時合理地清除,會造成業務邏輯混亂甚至應用卡死的情況,這個時就需要清除定時器事件監聽,即在頁面卸載(關閉)的生命周期函數里,清除定時器。

methods:{ resizeFun () { this.tableHeight = window.innerHeight - document.getElementById(’table’).offsetTop - 128 }, setTimer() { this.timer = setInterval(() => { }) }, clearTimer() {//清除定時器clearInterval(this.timer) this.timer = null}},mounted() { this.setTimer() window.addEventListener(’resize’, this.resizeFun)},beforeDestroy() { window.removeEventListener(’resize’, this.resizeFun) this.clearTimer()}防抖與節流

在前端開發的過程中,我們經常會需要綁定一些持續觸發的事件,如resize、scroll、mousemove等等,但有些時候我們并不希望在事件持續觸發的過程中那么頻繁地去執行函數。這時候就用到防抖與節流。

案例 1:遠程搜索時需要通過接口動態的獲取數據,若是每次用戶輸入都接口請求,是浪費帶寬和性能的。

<Select :remote-method='remoteMethod'> <Option v-for='item in temoteList' :value='item.value' :key='item.id'>{{item.label}}</Option></Select><script>function debounce(fn, wait) { let timeout = null return function () { if (timeout !== null) clearTimeout(timeout) timeout = setTimeout(fn, wait) }}export default { methods:{ remoteMethod:debounce(function (query) {// to do ... }, 200), }}<script>

案例 2:持續觸發scroll事件時,并不立即執行handle函數,當 1000 毫秒內沒有觸發scroll事件時,才會延時觸發一次handle函數。

function debounce(fn, wait) { let timeout = null return function () { if (timeout !== null) clearTimeout(timeout) timeout = setTimeout(fn, wait) }}function handle() { console.log(Math.random())}window.addEventListener(’scroll’, debounce(handle, 1000))異步加載js

默認情況下,瀏覽器是同步加載js腳本,解析 html 過程中,遇到<script>標簽就會停下來,等腳本下載、解析、執行完后,再繼續向下解析渲染。

如果 js 文件體積比較大,下載時間就會很長,容易造成瀏覽器堵塞,瀏覽器頁面會呈現出“白屏”效果,用戶會感覺瀏覽器“卡死了”,沒有響應。此時,我們可以讓 js 腳本異步加載、執行。

<script src='http://www.b3g6.com/bcjs/path/to/home.js' defer></script><script src='http://www.b3g6.com/bcjs/path/to/home.js' async></script>

上面代碼中,<script>標簽分別有defer和async屬性,瀏覽器識別到這 2 個屬性時 js 就會異步加載。也就是說,瀏覽器不會等待這個腳本下載、執行完畢后再向后執行,而是直接繼續向后執行

defer 與 async 區別:

defer:DOM 結構完全生成,以及其他腳本執行完成,才會執行(渲染完再執行)。有多個defer腳本時,會按照頁面出現的順序依次加載、執行。 async:一旦下載完成,渲染引擎就會中斷渲染,執行這個腳本以后,再繼續渲染(下載完就執行)。有多個async腳本時,不能保證按照頁面出現順序加載、執行

以上就是Javascript前端優化代碼的詳細內容,更多關于Javascript優化的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲一区| 亚洲尤物在线| 日韩一级欧洲| 99亚洲精品| 视频在线观看一区二区三区| 午夜在线精品偷拍| 免费看日韩精品| 日本亚洲三级在线| 日韩精品乱码av一区二区| 日韩精品一区二区三区中文| 青草av.久久免费一区| 欧美日一区二区三区在线观看国产免 | 开心激情综合| 国产精品.xx视频.xxtv| 久久精品国产999大香线蕉| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日本三级亚洲精品| 欧美激情 亚洲a∨综合| 久久精品国产亚洲aⅴ| 高清久久一区| 欧美久久精品一级c片| 亚洲日本免费电影| 美女视频黄 久久| 国产高清不卡| av不卡在线| 欧美一区成人| 欧美freesex黑人又粗又大| 91精品二区| 四虎在线精品| 精品视频黄色| 五月天久久777| 日韩精彩视频在线观看| 国产一区二区三区成人欧美日韩在线观看| 日韩av福利| 一二三区精品| 精品中文字幕一区二区三区四区| 色88888久久久久久影院| 亚洲综合日本| 麻豆精品视频在线观看| 亚洲电影在线| 国产三级精品三级在线观看国产| 日韩大片在线| 综合激情网站| 成人在线免费观看91| 久久大逼视频| 成人在线超碰| 亚洲欧洲美洲国产香蕉| 欧美好骚综合网| 久久国产精品99国产| 久久精品免费看| 美女久久一区| www.九色在线| 日韩久久一区| 国产99亚洲| 国产精品18| 视频在线在亚洲| 精品久久福利| 亚洲精选成人| 久久久精品日韩| 青草综合视频| 伊人成人网在线看| 精品国产精品久久一区免费式| 亚洲欧洲另类| 国产高清亚洲| 国产一区导航| 久久青青视频| 久久国产生活片100| 2023国产精品久久久精品双| 麻豆91小视频| 美国三级日本三级久久99| 日韩在线中文| 国产精品一区二区免费福利视频| 伊人精品视频| 国产精品xx| 国产亚洲高清在线观看| 日韩一级不卡| 欧美不卡高清一区二区三区| 欧美影院视频| 影音先锋国产精品| 色偷偷色偷偷色偷偷在线视频| 欧美日韩亚洲一区在线观看| 国产综合亚洲精品一区二| 久久精品国产成人一区二区三区| 亚洲三区欧美一区国产二区| 国产一区亚洲| а√在线中文在线新版| 国产精品一级| 日韩综合一区二区| 国产精品毛片在线| 欧美+日本+国产+在线a∨观看| 高清av一区| 国产精品扒开腿做爽爽爽软件| 亚洲天堂免费| 亚洲不卡av不卡一区二区| 精品国产午夜| 国产精品色在线网站| 综合一区二区三区| 午夜精品亚洲| 久久久亚洲一区| 91精品韩国| 中文字幕在线看片| 久久精品国产999大香线蕉 | 青草国产精品| 午夜性色一区二区三区免费视频| 亚洲成人一区| 久久久蜜桃一区二区人| 精品国产一区二区三区av片| 国产伦精品一区二区三区视频| 亚洲精品无播放器在线播放| 免费在线观看不卡| 蜜臀va亚洲va欧美va天堂| 亚洲综合日本| 国产一区91| 视频一区视频二区中文| 亚洲一区二区动漫| 麻豆91精品| 亚洲三级观看| 日本综合视频| 日本va欧美va瓶| 88久久精品| 国产精品天天看天天狠| 清纯唯美亚洲综合一区| 日韩精品久久理论片| 欧美一级二级三级视频| 欧美在线黄色| 国产剧情在线观看一区| 国产精品探花在线观看| 久久av超碰| 国产va免费精品观看精品视频| 国产a亚洲精品| 日本精品影院| 亚洲女同中文字幕| 天堂av在线一区| 日本成人精品| 国产情侣一区在线| 久久精品三级| 91精品韩国| av资源亚洲| 久久精品国产大片免费观看| 伊人久久成人| 日韩一二三区在线观看| 国产精品久久久免费| 成人午夜在线| 激情五月色综合国产精品| 亚洲欧美日韩一区在线观看| 日韩精品免费一区二区夜夜嗨| 国产精品美女午夜爽爽| 精品国产a一区二区三区v免费| 在线天堂资源www在线污| 欧美日韩在线网站| 视频一区二区三区在线| 日韩在线网址| 日韩一二三区在线观看| 国产精品99久久免费| 国产成人77亚洲精品www| 神马日本精品| 中文一区一区三区免费在线观| 日韩va亚洲va欧美va久久| 精品在线网站观看| 美女少妇全过程你懂的久久| 香蕉久久夜色精品国产| 国产精品巨作av| 欧美午夜精品一区二区三区电影| 中文字幕亚洲影视| 国产一区二区三区久久| 日韩视频不卡| 国产高清视频一区二区| 午夜av成人| 日本不卡视频在线观看| av资源新版天堂在线| 天使萌一区二区三区免费观看| 国产精品欧美大片| 激情综合网五月| 国产精品亚洲四区在线观看| 免费观看亚洲| 亚洲五月综合| 亚洲午夜天堂| 一区二区三区网站| 成人三级高清视频在线看| 天堂成人免费av电影一区| 国产精品久久久亚洲一区| 国产一区日韩一区| 亚洲精品黄色| 色偷偷色偷偷色偷偷在线视频| 美美哒免费高清在线观看视频一区二区| 麻豆国产一区| 国产视频亚洲| 免费视频一区二区三区在线观看| 亚洲高清毛片| 国产精品免费精品自在线观看| 久久精品99久久无色码中文字幕| 日本不卡不码高清免费观看| 999国产精品视频| 日本精品久久| 国产精品av一区二区| 国产精品sss在线观看av| 国产精品美女久久久| 麻豆91精品视频| 丝袜美腿成人在线| 亚洲天堂资源|