文分享自華為云社區《JavaScript代碼之美—代碼優化,減少if-else冗余的技巧-云社區-華為云》,作者:黛琳ghz。
前言
if-else 語句對于程序員來說,是非常非常熟悉的一個判斷語句,我們在日常開發和學習中都經常看見它,if-else語句主要用于需要做出選擇的地方進行判斷,這里就不再贅述if-else語法和特點了。
我們在寫代碼(如圖下,是我以前寫的計算器項目)或看項目的時候或多或少都接觸過擁有大量if語句(簡稱“屎山”)的項目代碼,多重嵌套的if-else在維護和修改的時候真的讓人崩潰(特別是看被人的項目的時候),有時候一個 bug 排查下來,整個人都麻木了。
如圖下的計算器項目的代碼就是多重if-else的一個例子,一眼看過去就覺得很冗余了,在功能不完善時,需要添加代碼很不方便。維護時,可讀性很差,而且很多bug。
關于R星公司(Rockstar Games游戲公司)的屎山代碼,相信很多人都有所耳聞,據說公司旗下的GTA 5游戲中循環19.8億次的if語句,可想而知加入游戲要多久啊。
因此,接下來我們將了解和學習一些優化的小技巧,來優化自己的代碼。
什么是短路運算,顧名思義,就是觸發到特定條件就短路,只要短路了就不會繼續往后執行。短路運算可以分為兩種邏輯運算符,分別是&&(與)和||(或)。
1.1.1運算規則
表達式1 && 表達式2,只有所有表達式都為true,則整個表達式的運算結果才為true。根據集合的補集的思想,只要任意表達式為false,則整個表達式的運算結果為false。
只要碰到了false或者等價于false的條件就短路,只要短路了就不會繼續往后執行了,然后得到造成短路的這個值,如果不短路,得到的是第二個值
1.1.2 代碼測試
console.log( true && true ); // true
console.log( false && true ); // false
console.log( true && false); // false
console.log(1 && 0); // 0
console.log( undefined && 0); // undefined
console.log(null && 1); // null
1.2.1運算規則
表達式1 || 表達式2,只要任意表達式為true,則整個表達式的運算結果為true。
只要碰到了true或者等價于true的條件就短路,只要短路了就不會繼續往后執行了,然后得到造成短路的這個值,如果不短路,得到的是第二個值
1.2.2代碼測試
?console.log( true || true ); // true
console.log( false || true ); // true
console.log( true || false); // true
console.log(1 || 0); // 1
console.log( undefined || 0); // 0
console.log(null || 1); // 1
三元運算符是一種需要三個操作數的運算符,運算的結果根據給定條件決定,有時候可以用三元運算符代替簡單的if-else判斷,但是三元運算符不建議多層嵌套,可讀性較差
條件表達式 ? 表達式1 : 表達式2
先求條件表達式的值,如果為true,則返回表達式1的執行結果;如果條件表達式的值為false,則返回表達式2的執行結果。
//三元表達式來判斷
var age=prompt('請輸入需要判斷的年齡:')
var status=age >=18 ? '已成年' : '未成年'
console.log(status)
//if-else來判斷
var age=prompt('請輸入需要判斷的年齡:')
if(age>=18){
console.log('已成年')
}else{
console.log('未成年')
}
swtich(n) {
case 常量1 :
要執行的語句;
break;
case 常量2 :
要執行的語句;
break;
case 常量3 :
要執行的語句;
break;
default:
要執行的語句;
break;
}
switch 后面的 (n) 可以是表達式,也可以(并通常)是變量。然后表達式中的值會與 case 中的數字作比較,如果與某個 case 相匹配,那么其后的代碼就會被執行。break 的作用是防止代碼自動執行到下一行。
switch 語句和具有同樣表達式的一系列的if語句相似。很多場合下需要把同一個變量(或表達式)與很多不同的值比較,并根據它等于哪個值來執行不同的代碼。
面對多層嵌套的if-else判斷時,可以選擇使用switch語句來寫,這樣代碼可讀性更好
3.1.1PS:有時候簡單的if判斷比switch語句更加簡潔
在寫讓數字1-9前面加上0時的效果,我就用過switch語句來寫,發現非常冗余
其實一句if判斷就解決了,就是判斷這個是否小于10,如果是就在數字前加上0
策略模式是指有一定行動內容的相對穩定的策略名稱,策略模式作為一種
軟件設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。
策略模式是一種行為設計模式,定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。目的是實現方法的使用和實現分開。
文章開頭我也說過,我在寫計算器項目的時候,在編寫計算器的功能時,我寫了大量的if-else語句來實現這些功能,但是這樣操作了代碼的冗余,并且可讀性差、bug很多,因此我親切的稱呼其為“8噶機”。如下圖可以看到代碼非常冗余,嵌套了大量的if-else來進行判斷,導致項目越寫bug越多
于是我選擇用JavaScript設計模式-策略模式來重新編寫封裝這些功能函數,使用之前我們要分清楚策略模式的兩個組成部分,一個是策略類,一個是環境類
策略類(可變):封裝了具體的方法,并且負責方法的實現。
環境類(不可變):接受調用,并把請求委托給某個方法,最終被客戶端調用。
一些功能圖如下,由此可知圖一為策略類,圖二為環境類
圖一
圖二
4.3.1代碼如下
let strategy={
"A": function ( salary ){
return salary*4;
},
"B": function ( salary ) {
return salary*3;
},
"C": function ( salary ) {
return salary*2;
}
}
let calculateBonus=function ( level, salary ) { //level是指 A B C這三個對象
return strategy[ level ]( salary );
}
console.log(calculateBonus('A', 10)) // 40
JavaScript的對象可以直接創建,將函數封裝進去,這樣一來就可以減少if-else語句進行多層嵌套了,代碼顯得清晰簡潔,可讀性更好。而且代碼的維護和修改更加清晰。
點擊下方,第一時間了解華為云新鮮技術~
華為云博客_大數據博客_AI博客_云計算博客_開發者中心-華為云
擊上方藍字關注“小鄭搞碼事”,每天都能學到知識,搞懂一個問題!
為了解決不同瀏覽器之間的一些行為差異,前端都會在代碼里加一段CSSReset代碼,來將所有的元素設置統一的樣式,從而保證我們能在一個統一的樣式下開始開發項目。
大多數人,這部分代碼都不愿意手動去寫,經常會用一些現有的庫來處理這部分工作,如normalize.css,minireset等等。其實這里面有好多冗余的CSS代碼。我一般不太喜歡這么搞。
然而,如果你也是和我一樣,是自己去寫這部分代碼的話,我建議你往里加一行代碼,如下所示:
如上面代碼所示,margin和padding沒什么奇怪的,主要注意box-sizing我設置了border-box。
對的,所有的DOM的都應該為border-box。如果有人對box-sizing不是很了解的話,那么,下面,接下來我就給大家理清一下它的用法。(之前,我的文章里有寫過它的詳細用法,可以參考)
它主要有兩種取值:
1、content-box
當設置某個元素的寬高(width/height)時,僅僅會作用于其內容尺寸。其它,所有的padding和margin都是在其之上的累加。
比如:有個DIV設置width=80,padding=10,那么最終元素占用100(80+2*10)像素。
2、border-box
記住,padding和margin是包含在了寬高之內的。
比如,有個DIV設置width=80,padding=10,marign=10那么最終元素占用80(40+2*10+2*10)像素。
總結一下:
在重置代碼里將元素設置為border-box會很方便我們進行樣式布局。比如可以在父元素設置高度限制而不擔心子元素的內邊距或者邊框來打破這種限制。
眾號【傳智播客博學谷】回復關鍵詞:前端 PS Java(100G) Python(80G) 大數據 區塊鏈 測試 PPT JS(40g+300教程) HTML 簡歷 領取相關學習資料!
一、HTML
1、<image>標簽上title屬性與alt屬性的區別是什么?
alt屬性是為了給那些不能看到你文檔中圖像的瀏覽者提供文字說明的。且長度必須少于100個英文字符或者用戶必須保證替換文字盡可能的短。
這包括那些使用本來就不支持圖像顯示或者圖像顯示被關閉的瀏覽器的用戶,視覺障礙的用戶和使用屏幕閱讀器的用戶等。
title屬性為設置該屬性的元素提供建議性的信息。使用title屬性提供非本質的額外信息。參考《alt和title屬性的區別及應用》
2、分別寫出以下幾個HTML標簽:文字加粗、下標、居中、字體
加粗:<b>、<strong>
下標:<sub>
居中:<center>
字體:<font>、<basefont>、參考《HTML標簽列表》
3、請寫出至少5個html5新增的標簽,并說明其語義和應用場景
section:定義文檔中的一個章節
nav:定義只包含導航鏈接的章節
header:定義頁面或章節的頭部。它經常包含 logo、頁面標題和導航性的目錄。
footer:定義頁面或章節的尾部。它經常包含版權信息、法律信息鏈接和反饋建議用的地址。
aside:定義和頁面內容關聯度較低的內容——如果被刪除,剩下的內容仍然很合理。
參考《HTML5 標簽列表》
4、請說說你對標簽語義化的理解?
a. 去掉或者丟失樣式的時候能夠讓頁面呈現出清晰的結構
b. 有利于SEO:和搜索引擎建立良好溝通,有助于爬蟲抓取更多的有效信息:爬蟲依賴于標簽來確定上下文和各個關鍵字的權重;
c. 方便其他設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁;
d. 便于團隊開發和維護,語義化更具可讀性,遵循W3C標準的團隊都遵循這個標準,可以減少差異化。
5、Doctype作用? 嚴格模式與混雜模式如何區分?它們有何意義?
聲明位于文檔中的最前面,處于 標簽之前。告知瀏覽器以何種模式來渲染文檔。
嚴格模式的排版和 JS 運作模式是,以該瀏覽器支持的最高標準運行。
在混雜模式中,頁面以寬松的向后兼容的方式顯示。模擬老式瀏覽器的行為以防止站點無法工作。
DOCTYPE不存在或格式不正確會導致文檔以混雜模式呈現。
6、你知道多少種Doctype文檔類型?
標簽可聲明三種 DTD 類型,分別表示嚴格版本、過渡版本以及基于框架的 HTML 文檔。
HTML 4.01 規定了三種文檔類型:Strict、Transitional 以及 Frameset。
XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。
Standards (標準)模式(也就是嚴格呈現模式)用于呈現遵循最新標準的網頁,
Quirks(包容)模式(也就是松散呈現模式或者兼容模式)用于呈現為傳統瀏覽器而設計的網頁。
7、HTML與XHTML——二者有什么區別
a. XHTML 元素必須被正確地嵌套。
b. XHTML 元素必須被關閉。
c. 標簽名必須用小寫字母。
d. XHTML 文檔必須擁有根元素。
參考《XHTML 與 HTML 之間的差異》
8、html5有哪些新特性、移除了那些元素?
a. HTML5 現在已經不是 SGML 的子集,主要是關于圖像,位置,存儲,多任務等功能的增加。
b. 拖拽釋放(Drag and drop) API
c. 語義化更好的內容標簽(header,nav,footer,aside,article,section)
d. 音頻、視頻API(audio,video)
e. 畫布(Canvas) API
f. 地理(Geolocation) API
g. 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失
h. sessionStorage 的數據在頁面會話結束時會被清除
i. 表單控件,calendar、date、time、email、url、search
j. 新的技術webworker, websocket等
移除的元素:
a. 純表現的元素:basefont,big,center, s,strike,tt,u;
b. 對可用性產生負面影響的元素:frame,frameset,noframes;
9、iframe的優缺點?
優點:
a. 解決加載緩慢的第三方內容如圖標和廣告等的加載問題
b. iframe無刷新文件上傳
c. iframe跨域通信
缺點:
a. iframe會阻塞主頁面的Onload事件
b. 無法被一些搜索引擎索引到
c. 頁面會增加服務器的http請求
d. 會產生很多頁面,不容易管理。
參考《iframe的一些記錄》
10、Quirks模式是什么?它和Standards模式有什么區別?
在寫程序時我們也會經常遇到這樣的問題,如何保證原來的接口不變,又提供更強大的功能,尤其是新功能不兼容舊功能時。IE6以前的頁面大家都不會去寫DTD,所以IE6就假定 如果寫了DTD,就意味著這個頁面將采用對CSS支持更好的布局,而如果沒有,則采用兼容之前的布局方式。這就是Quirks模式(怪癖模式,詭異模式,怪異模式)。
區別:總體會有布局、樣式解析和腳本執行三個方面的區別。
a. 盒模型:在W3C標準中,如果設置一個元素的寬度和高度,指的是元素內容的寬度和高度,而在Quirks 模式下,IE的寬度和高度還包含了padding和border。
b. 設置行內元素的高寬:在Standards模式下,給等行內元素設置wdith和height都不會生效,而在quirks模式下,則會生效。
c. 設置百分比的高度:在standards模式下,一個元素的高度是由其包含的內容來決定的,如果父元素沒有設置百分比的高度,子元素設置一個百分比的高度是無效的用
d. 設置水平居中:使用margin:0 auto在standards模式下可以使元素水平居中,但在quirks模式下卻會失效。
11、請闡述table的缺點
a. 太深的嵌套,比如table>tr>td>h3,會導致搜索引擎讀取困難,而且,最直接的損失就是大大增加了冗余代碼量。
b. 靈活性差,比如要將tr設置border等屬性,是不行的,得通過td
c. 代碼臃腫,當在table中套用table的時候,閱讀代碼會顯得異常混亂
d. 混亂的colspan與rowspan,用來布局時,頻繁使用他們會造成整個文檔順序混亂。
e. 不夠語義
參考《為什么說table表格布局不好?》
12、簡述一下src與href的區別
src用于替換當前元素;href用于在當前文檔和引用資源之間確立聯系。
src是source的縮寫,指向外部資源的位置,指向的內容將會嵌入到文檔中當前標簽所在位置
href是Hypertext Reference的縮寫,指向網絡資源所在位置,建立和當前元素(錨點)或當前文檔(鏈接)之間的鏈接
公眾號【傳智播客博學谷】回復關鍵詞:前端 PS Java Python 大數據 區塊鏈 測試 PPT JS HTML 簡歷 領取相關學習資料!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。