摘要:請(qǐng)注意,由于的分號(hào)插入機(jī)制如果語(yǔ)句沒(méi)有使用分號(hào)結(jié)束,會(huì)自動(dòng)補(bǔ)充分號(hào),因此上面的代碼實(shí)際相當(dāng)于如下寫(xiě)法自動(dòng)插入分號(hào)正確的寫(xiě)法應(yīng)該是輸出更新判斷語(yǔ)句的優(yōu)化在業(yè)務(wù)中經(jīng)常會(huì)遇到類(lèi)似對(duì)請(qǐng)求結(jié)果判斷后讀取的情況。
寫(xiě)在前面
(難得從繁重的業(yè)務(wù)代碼中抽身,更新一下文章)前端框架和技術(shù)日益發(fā)展,但是不管怎么變,js永遠(yuǎn)都是最重要的基礎(chǔ),本文記錄和總結(jié)一些日常開(kāi)發(fā)中常見(jiàn)的js代碼技巧和誤區(qū),不定期更新。
正文 1. 避免鏈?zhǔn)铰暶?/b>后果:可能引入全局變量
//錯(cuò)誤的寫(xiě)法 var a = b = 0;
這段代碼中,b實(shí)際上被聲明為全局變量。因?yàn)椴僮鞣麅?yōu)先級(jí)是是從右往左,所以該語(yǔ)句相當(dāng)于:
var a = (b = 0)
此時(shí)b未聲明就被直接賦值,所以b成了全局變量
2. 單一var原則這條規(guī)則的意思是,把函數(shù)內(nèi)部的所有變量,放到頂部聲明。比如:
//示例 function A(){ var a = 1, b = 2, c = a + b ; }
優(yōu)點(diǎn):
便于查找函數(shù)內(nèi)部使用的局部變量
防止變量未定義時(shí)就被使用
防止變量聲明提升后引發(fā)的誤解
關(guān)于第三點(diǎn),這里舉個(gè)例子說(shuō)明:
var x = 1; function A(){ console.log(x);//第一處輸出 ,注意結(jié)果 var x = 2; console.log(x);//第二處輸出 2,沒(méi)問(wèn)題 }
從代碼上看,第二處輸出肯定沒(méi)問(wèn)題,可能會(huì)有人認(rèn)為第一處輸出的是1,因?yàn)榇藭r(shí)在函數(shù)內(nèi)部還沒(méi)聲明變量x,根據(jù)作用域鏈,向外層查找的話,x值為1。但是實(shí)際輸出的值應(yīng)該是undefined,因?yàn)?strong>js允許在函數(shù)任何地方聲明變量,并且無(wú)論在哪里聲明都等同于在頂部聲明,這就是聲明提升。所以上面的代碼相當(dāng)于:
var x = 1; function A(){ var x;//提升到頂部 console.log(x);//此時(shí)已聲明 未賦值 x = 2;//賦值 console.log(x); }3. 使用for循環(huán)時(shí),緩存長(zhǎng)度值
通常用使用for循環(huán)遍歷數(shù)組時(shí),會(huì)采用以下寫(xiě)法:
for(var i = 0;i這段代碼存在的問(wèn)題在于,在循環(huán)的每個(gè)迭代步驟,都必須訪問(wèn)一次arr的長(zhǎng)度。如果arr是靜態(tài)數(shù)值還好,但是我們?cè)谑褂?b>js時(shí)可能會(huì)碰到arr是dom元素對(duì)象,由于dom對(duì)象載頁(yè)面下是活動(dòng)的查詢,這個(gè)長(zhǎng)度查詢就相當(dāng)耗時(shí),
//用len緩存長(zhǎng)度值 for(var i = 0,len = arr.length;i按照上面的代碼,我們?cè)诘谝淮潍@取長(zhǎng)度值時(shí)就緩存這個(gè)長(zhǎng)度值,就可以避免上述問(wèn)題。
4. 使用for-in時(shí),增加hasOwnProperty()判斷for-in通常用來(lái)枚舉對(duì)象的屬性和方法,但是這個(gè)方法會(huì)枚舉范圍包括對(duì)象和對(duì)象的原型對(duì)象(對(duì)原型對(duì)象不了解的可以看看我之前寫(xiě)的文章傳送門(mén))此時(shí),利用hasOwnProperty()方法可以幫我們過(guò)濾出只在對(duì)象本身上的屬性和方法,或者只在原型鏈的屬性和方法
for(var key in obj){ if(obj.hasOwnProperty(key)){ // 對(duì)象本身的屬性或者方法 } else{ // 原型鏈的屬性和方法 } } /* 下面是一個(gè)具體的例子 */ function A(name){ this.type = "A類(lèi)"; this.name = name || "未命名" } var a = new A("a"); function B(name){ this.subtype = "B類(lèi)"; } // 建立原型鏈 B.prototype = a; B.prototype.sayHello = function(){} var b = new B(); // 遍歷屬性 for(var key in b){ //對(duì)象自身屬性 if(b.hasOwnProperty(key)){ console.log("對(duì)象自身的屬性或方法:"+key) } //上述表達(dá)式的另一種寫(xiě)法 if(Object.prototype.hasOwnProperty.call(b,key)){ console.log("對(duì)象自身的屬性或方法:"+key) } else { console.log("原型鏈的屬性或方法:"+key) } }5. 使用===代替==這個(gè)算是比較常見(jiàn)的了,因?yàn)閖s在做比較判斷時(shí),會(huì)執(zhí)行強(qiáng)制類(lèi)型轉(zhuǎn)換,比如false == 0返回true這樣的情況,使用===可以執(zhí)行嚴(yán)格的等價(jià)比較,更易于閱讀代碼(后來(lái)閱讀的人就不需要判斷這個(gè)是遺漏還是故意使用強(qiáng)制類(lèi)型轉(zhuǎn)換簡(jiǎn)寫(xiě))
6. 使用parseInt()時(shí),帶上第二個(gè)參數(shù)。parseInt()用于從字符串中獲取數(shù)值,第二個(gè)參數(shù)代表進(jìn)制,默認(rèn)是10。我們?cè)谑褂玫臅r(shí)候可能習(xí)慣性忽略這個(gè)參數(shù),但是在一些情況下會(huì)有問(wèn)題:當(dāng)字符串的開(kāi)頭為0時(shí),在es3里會(huì)被當(dāng)做是八進(jìn)制,es5里面仍然當(dāng)做10進(jìn)制,為了代碼的一致性以及避免不必要的失誤,應(yīng)該每次使用時(shí)都帶上參數(shù):
var x = parseInt("089",10);//使用時(shí)都帶上進(jìn)制參數(shù)7. 大括號(hào)的使用大括號(hào)的使用主要是2個(gè)方面:
第1,不要省略大括號(hào),即使可以忽略,比如:
for(var i =1;i<10 ;i++) console.log(i) //此處原則上可以忽略大括號(hào)上述語(yǔ)句并沒(méi)有問(wèn)題,但是如果后期函數(shù)體內(nèi)增加了其他語(yǔ)句的時(shí)候,很容易忘記補(bǔ)上大括號(hào),因此建議都帶上大括號(hào);
第2,大括號(hào)的必須跟在前一個(gè)語(yǔ)句的同一行
這個(gè)地方為什么加粗了呢?因?yàn)檫@個(gè)問(wèn)題非常容易被忽略,通常我們都覺(jué)得大括號(hào)是跟在語(yǔ)句的同一行還是下一行只是習(xí)慣問(wèn)題,但是實(shí)際上不是的!看下面這個(gè)例子:
function func(){ return { name:"xxx" } } var res = func() console.log(res)//輸出undefined是不是覺(jué)得很奇怪,看代碼第一感覺(jué)應(yīng)該是輸出一個(gè)包含name屬性的對(duì)象。請(qǐng)注意,由于js的分號(hào)插入機(jī)制:如果語(yǔ)句沒(méi)有使用分號(hào)結(jié)束,會(huì)自動(dòng)補(bǔ)充分號(hào),因此上面的代碼實(shí)際相當(dāng)于如下寫(xiě)法:
function func(){ return undefined;//自動(dòng)插入分號(hào) { name:"xxx" } }正確的寫(xiě)法應(yīng)該是:
function func(){ return { name:"xxx" } } var res = func() console.log(res)//輸出{name:"xxx"}(----------------------06.15更新------------------------)
8 . 判斷語(yǔ)句的優(yōu)化在業(yè)務(wù)中經(jīng)常會(huì)遇到類(lèi)似對(duì)請(qǐng)求結(jié)果判斷后讀取的情況。比如:
requset().then(function(res){ if(res){ //對(duì)返回?cái)?shù)據(jù)進(jìn)行操作的代碼 } else{ } })這種寫(xiě)法沒(méi)有問(wèn)題,但是有時(shí)候邏輯比較長(zhǎng),嵌套的大括號(hào)比較多。此時(shí)可以采用另一種寫(xiě)法
requset().then(function(res){ // 先判斷!res if(!res){ /// } //對(duì)返回?cái)?shù)據(jù)進(jìn)行操作的代碼 })這種寫(xiě)法可以減少一次嵌套,在邏輯判斷較多時(shí),嵌套層數(shù)減少可以增加代碼可讀性。
(----------------------06.20更新------------------------)
9 . 對(duì)url進(jìn)行encode此條主要是在這兩天修復(fù)一個(gè)遺留bug時(shí)候發(fā)現(xiàn),一個(gè)上傳組件在ie下失效,其中一個(gè)原因是上傳的請(qǐng)求url參數(shù)中包含中文參數(shù),但是未手動(dòng)encodeURI,原先的開(kāi)發(fā)者可能只考慮了chrome下的情況。由于chrome會(huì)自動(dòng)對(duì)url進(jìn)行encode,所以很容易忽略其他瀏覽器,為了避免此類(lèi)的兼容問(wèn)題,建議總是手動(dòng)做好編碼處理。
(----------------------08.16更新------------------------)
10.空對(duì)象判斷(要考慮不可枚舉屬性)先上代碼:
function X() { } //原型上的屬性 X.prototype.age = "22" var x = new X() Object.defineProperty(x, "name", { enumerable: false, value: "張三" }) console.log(x) //方法1 使用for...in遍歷 function isEmptyObject1(obj) { for (var attr in obj) { return false } return true } //方法2 使用JSON.stringify function isEmptyObject2(obj) { return (JSON.stringify(obj) === "{}") } //方法3 使用Object.keys function isEmptyObject3(obj) { return Object.keys(obj).length === 0 } //方法4 使用getOwnPropertyNames function isEmptyObject4(obj) { return Object.getOwnPropertyNames(obj).length === 0 } console.log(isEmptyObject1(x)) //true console.log(isEmptyObject2(x)) //true console.log(isEmptyObject3(x)) //true console.log(isEmptyObject4(x)) //false(----------------------2019.01.17更新------------------------)
11.封裝請(qǐng)求函數(shù)時(shí),考慮使用對(duì)象代替數(shù)組傳參// 1.使用數(shù)組方式傳參,需要嚴(yán)格按照參數(shù)順序,并且對(duì)于多個(gè)可選參數(shù)的情況不好處理 const getMethod = (id,uid,option1,option2)=>{ const config = { // 參數(shù)處理 } request.get(config) } // 如果此時(shí)可選參數(shù)1不傳,卻要傳入可選參數(shù)2,則必須傳入空值占位 getMethod("e3ruewruwieru","231423asd",null,"asdasd") // 2. 使用對(duì)象傳參時(shí),可以不按照順序傳入?yún)?shù) const getMethod = (query) =>{ const { id, uid, option1,option2} = query //直接解構(gòu)出需要的參數(shù) const config = { option1:option1 ||"" //即使多個(gè)可選參數(shù),處理起來(lái)也很方便 } request.get(config) } // 使用比較靈活 并且不用考慮參數(shù)順序 const query = { id:"123", uid:"asd", option2:"goodjob" } getMethod(query)小結(jié)本文會(huì)長(zhǎng)期更新和補(bǔ)充(如果我沒(méi)被淹沒(méi)在業(yè)務(wù)中的話),歡迎讀者提出建議和意見(jiàn)。
然后依然是每次都一樣的結(jié)尾,如果內(nèi)容有錯(cuò)誤的地方歡迎指出;如果對(duì)你有幫助,歡迎點(diǎn)贊和收藏,轉(zhuǎn)載請(qǐng)征得同意后著明出處,如果有問(wèn)題也歡迎私信交流,主頁(yè)添加了郵箱地址~溜了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/95394.html
摘要:歡迎來(lái)我的個(gè)人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開(kāi)啟性能優(yōu)化之旅高性能滾動(dòng)及頁(yè)面渲染優(yōu)化理論寫(xiě)法對(duì)壓縮率的影響唯快不破應(yīng)用的個(gè)優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁(yè)瞬開(kāi)緩存網(wǎng)頁(yè)性能管理詳解寫(xiě)給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動(dòng) 歡迎來(lái)我的個(gè)人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開(kāi)啟性能優(yōu)化之旅 高性能滾動(dòng) scroll 及頁(yè)面渲染優(yōu)化 理論 | HTML寫(xiě)法...
摘要:歡迎來(lái)我的個(gè)人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開(kāi)啟性能優(yōu)化之旅高性能滾動(dòng)及頁(yè)面渲染優(yōu)化理論寫(xiě)法對(duì)壓縮率的影響唯快不破應(yīng)用的個(gè)優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁(yè)瞬開(kāi)緩存網(wǎng)頁(yè)性能管理詳解寫(xiě)給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動(dòng) 歡迎來(lái)我的個(gè)人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開(kāi)啟性能優(yōu)化之旅 高性能滾動(dòng) scroll 及頁(yè)面渲染優(yōu)化 理論 | HTML寫(xiě)法...
摘要:歡迎來(lái)我的個(gè)人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開(kāi)啟性能優(yōu)化之旅高性能滾動(dòng)及頁(yè)面渲染優(yōu)化理論寫(xiě)法對(duì)壓縮率的影響唯快不破應(yīng)用的個(gè)優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁(yè)瞬開(kāi)緩存網(wǎng)頁(yè)性能管理詳解寫(xiě)給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動(dòng) 歡迎來(lái)我的個(gè)人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開(kāi)啟性能優(yōu)化之旅 高性能滾動(dòng) scroll 及頁(yè)面渲染優(yōu)化 理論 | HTML寫(xiě)法...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
閱讀 2620·2023-04-26 00:57
閱讀 975·2021-11-25 09:43
閱讀 2287·2021-11-11 16:55
閱讀 2366·2019-08-30 15:53
閱讀 3657·2019-08-30 15:52
閱讀 1532·2019-08-30 14:10
閱讀 3437·2019-08-30 13:22
閱讀 1265·2019-08-29 11:18