摘要:而用來聲明一些根據(jù)判斷條件會(huì)發(fā)生變化的變量。函數(shù)中盡量避免的嵌套是十分常見的一種邏輯。僅對(duì)原數(shù)組進(jìn)行一次遍歷。當(dāng)然,使用專門的請(qǐng)求庫也是很好的選擇。以上總結(jié)僅僅是個(gè)人對(duì)于工作中的一些細(xì)節(jié)上的經(jīng)驗(yàn)之談。
不知不覺,正式工作馬上兩年了,待了兩家公司,做過的項(xiàng)目也不少了,總結(jié)一下自己在寫代碼上的經(jīng)驗(yàn)累積。1. 確定變量的類型
JS是弱類型語言,類型檢查不嚴(yán)格。在判斷兩個(gè)變量是否相等的時(shí)候,使用==會(huì)進(jìn)行隱式的類型轉(zhuǎn)換。比如:
["a"] == "a"; // true; 1 == "1"; // true;
在前端項(xiàng)目日益復(fù)雜的今天,早已不再是后端吐出數(shù)據(jù),前端直接展示就行了。一些計(jì)算是需要放在前端進(jìn)行的。前端要進(jìn)行計(jì)算,那么變量的類型在整個(gè)過程中,就必須是明確的。不然很容易出一些bug。舉個(gè)最簡(jiǎn)單的例子,
var a = "0.1"; var b; if(a == 0.1) { b = a.toFixed(3); // 出錯(cuò),因?yàn)樽址疀]有toFixed方法。 }
聲明一個(gè)變量的時(shí)候,首先明確這個(gè)變量的類型,用const 進(jìn)行聲明。這樣后續(xù)寫代碼過程中,能夠清晰的知道這個(gè)變量的類型,避免對(duì)變量進(jìn)行不合法的操作或者一不小心對(duì)變量進(jìn)行了修改,出現(xiàn)bug。并且,一開始使用const聲明變量,后續(xù)review代碼時(shí),思路能稍微清晰一點(diǎn)(這個(gè)變量就是用來干這個(gè)事情的,它是不會(huì)改變的)。而let用來聲明一些根據(jù)判斷條件會(huì)發(fā)生變化的變量。
使用const來聲明變量后,那用什么來聲明常量,并且可以避免和const聲明的變量混淆呢?可以采用大寫變量名來聲明常量。比如圓周率
const PI =3.1415926535;
在代碼中,看到名字大寫的變量是,我就知道了,這是一個(gè)全局的常量。
2. 多使用純函數(shù)純函數(shù),就是不會(huì)產(chǎn)生副作用的函數(shù)。舉一個(gè)例子,
const fn = arr => { // 非純函數(shù) arr.push(1); } const pureFn = arr => { // 純函數(shù) return [].slice.call(arr).push(1); } const oldArr = [2,3]; fn(oldArr); // fn修改了原數(shù)組,不純 const newArr = pureFn(oldArr); // pureFn返回了一個(gè)新數(shù)組,沒有修改原數(shù)組。
使用純函數(shù)的好處是,函數(shù)的輸出僅僅依賴輸入,不會(huì)受外部條件影響,并且不會(huì)影響到外部的環(huán)境。調(diào)試代碼時(shí),可以以函數(shù)為單位來驗(yàn)證、測(cè)試。
像上面的例子,我們?cè)诤瘮?shù)fn中修改了oldArr, 如果我們?cè)诹硗庖粋€(gè)地方又需要操作oldArr的時(shí)候, 我們能100%的保證知道這個(gè)oldArr已經(jīng)被修改過了嘛?當(dāng)業(yè)務(wù)邏輯變得復(fù)雜的時(shí)候,我們很容易就忽略了這個(gè)問題,導(dǎo)致出現(xiàn)莫名其妙的bug。而純函數(shù)就不會(huì)有這種問題,我們只需要關(guān)注其輸入和輸出就行。
再考慮一種情況,在使用vue或者react進(jìn)行開發(fā)的時(shí)候,經(jīng)常會(huì)遇到我明明更新了這個(gè)數(shù)組,可是頁面沒有重新渲染的問題。這是因?yàn)椋?b>vue和react在進(jìn)行數(shù)據(jù)的diff時(shí),對(duì)于數(shù)組(引用數(shù)據(jù)類型),都沒有采用深比較。如果我僅僅只改變了數(shù)組中的一個(gè)元素時(shí),數(shù)組其實(shí)并沒有變化,vue和react發(fā)現(xiàn)沒有diff,當(dāng)然不會(huì)重新渲染。使用純函數(shù)就不會(huì)有這個(gè)問題,因?yàn)槊看味际欠祷匾粋€(gè)全新的數(shù)組。
3. 函數(shù)中盡量避免if、else的嵌套if 、else是十分常見的一種邏輯。如果在代碼中,出現(xiàn)了復(fù)雜的嵌套,會(huì)降低代碼可讀性,并且容易出錯(cuò)。比如下面的代碼:
function fn (a,b,c){ if(a>1){ if(b === c){ return true; } else { return false; } } else { return true; } }
以上代碼可以改寫為,避免了多層的嵌套,代碼的可讀性得到了增強(qiáng)。
function fn(a,b,c){ if(a <= 1) { return true; } if(b === c){ return true; } return false; }
同時(shí),還可以多使用短路,減少if 、 else的使用
var b; if(condition) { b = 1; } // 可以改寫成 var b; condition && (b = 1);4. 熟練使用數(shù)組的各種操作方法
Array.forEach、Array.map、Array.filter、Array.reduce等等,都是特別好用的數(shù)組操作方法,幾乎可以滿足各種的遍歷需要了,比for循環(huán)來得優(yōu)雅。
Array.forEach僅對(duì)原數(shù)組進(jìn)行一次遍歷。
Array.map對(duì)原數(shù)組進(jìn)行遍歷,返回一個(gè)新數(shù)組。
Array.filter對(duì)原數(shù)組進(jìn)行過濾,同時(shí)返回一個(gè)新數(shù)組。
Array.reduce對(duì)原數(shù)組進(jìn)行一次遍歷,可以進(jìn)行累加。
但其實(shí)for循環(huán)有一個(gè)以上方法都沒有的優(yōu)點(diǎn),for循環(huán)可以隨時(shí)中止數(shù)組的遍歷,break一下就行。
可以根據(jù)不同場(chǎng)景采用不同的遍歷方法。
5. 減少對(duì)jQuery、zepto的依賴,積累自己的小工具庫如今寫代碼已經(jīng)很少使用jQuery和zepto了。jQuery和zepto確實(shí)給我們帶來了很大的方便,但很多時(shí)候,使用jQuery或者zepto只是為了使用選擇器,發(fā)送請(qǐng)求,簡(jiǎn)單動(dòng)畫。選擇器完全可以用querySelector等代替了,發(fā)送網(wǎng)絡(luò)請(qǐng)求,不管是ajax或者jsonp,自己封裝一個(gè)就行,沒有必要為了這一個(gè)功能,引入一個(gè)完整的jQuery或zepto。當(dāng)然,使用專門的http請(qǐng)求庫也是很好的選擇。簡(jiǎn)單動(dòng)畫使用css3就可以完成了,并不需要使用js操作DOM。
在業(yè)務(wù)中,一些經(jīng)常使用的小的功能,比如獲取dom元素距離頁面頂部的高度,獲取url中的參數(shù),判斷變量類型,函數(shù)防抖,函數(shù)節(jié)流等等,完全可以封裝進(jìn)自己的小工具庫,在多個(gè)項(xiàng)目中使用。
寫在最后工作時(shí)間還不夠長,代碼量也還不夠,對(duì)于javascript的一些高級(jí)應(yīng)用,編程技巧,各種設(shè)計(jì)模式在項(xiàng)目中的應(yīng)用,項(xiàng)目的整體架構(gòu)等還沒有很深入的理解,react、vue等框架也只是會(huì)用而已,并沒有很深入的研究。
以上總結(jié)僅僅是個(gè)人對(duì)于工作中的一些細(xì)節(jié)上的經(jīng)驗(yàn)之談。歡迎交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/95853.html
摘要:性能訪問字面量和局部變量的速度是最快的,訪問數(shù)組和對(duì)象成員相對(duì)較慢變量標(biāo)識(shí)符解析過程搜索執(zhí)行環(huán)境的作用域鏈,查找同名標(biāo)識(shí)符。建議將全局變量存儲(chǔ)到局部變量,加快讀寫速度。優(yōu)化建議將常用的跨作用域變量存儲(chǔ)到局部變量,然后直接訪問局部變量。 缺陷 這本書是2010年出版的,這本書談性能是有時(shí)效性的,現(xiàn)在馬上就2018年了,這幾年前端發(fā)展的速度是飛快的,書里面還有一些內(nèi)容考慮IE6、7、8的東...
摘要:高性能小結(jié)文章轉(zhuǎn)載于我的博客最近看完了動(dòng)物叢書的高性能,覺得那本書的小結(jié)部分寫得非常不錯(cuò),簡(jiǎn)潔輕快易懂概括性很強(qiáng)。由于局部變量存在于作用域鏈的起始位置,因此訪問局部變量比訪問跨作用域變量更快。 高性能javascript小結(jié) 文章轉(zhuǎn)載于我的CSDN博客:http://blog.csdn.net/hello_world_20/article/details/46793317 最近看完了動(dòng)...
摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷耄热绲鹊?,而面向?qū)ο蟮闹饕枷雽?duì)象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會(huì)常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊龋@個(gè)編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當(dāng)你新接觸一門語言的時(shí)候,有些問題是需...
摘要:最近在全力整理高性能的文檔,并重新學(xué)習(xí)一遍,放在這里方便大家查看并找到自己需要的知識(shí)點(diǎn)。 最近在全力整理《高性能JavaScript》的文檔,并重新學(xué)習(xí)一遍,放在這里方便大家查看并找到自己需要的知識(shí)點(diǎn)。 前端開發(fā)文檔 高性能JavaScript 第1章:加載和執(zhí)行 腳本位置 阻止腳本 無阻塞的腳本 延遲的腳本 動(dòng)態(tài)腳本元素 XMLHTTPRequest腳本注入 推薦的無阻塞模式...
閱讀 2228·2021-11-12 10:36
閱讀 2228·2021-09-03 10:41
閱讀 2886·2021-08-19 10:57
閱讀 1355·2021-08-17 10:14
閱讀 1543·2019-08-30 15:53
閱讀 1267·2019-08-30 15:43
閱讀 1032·2019-08-30 13:16
閱讀 3062·2019-08-29 16:56