Demo . 1
//bad if (age > 20) { return true; } else { return false; } //good return age > 20;
這種一看就明白吧,沒什么說的。
Demo . 2
//bad for (var i = 0; i < arr.length; i++) { //do something... } //good for (var i = 0, len = arr.length; i < len; i++) { //do something... }
將數組的長度進行存儲,循環時就不用每次去讀取一次數組長度,從而提升性能
Demo . 3
//bad if (value !== "") { //do something... } //good if (value) { //do something... }
js中所有 非空字符 作布爾運算時,都會返回 true,反之返回 false。 (空格 屬於非空字符)
Demo . 4
//bad if (value !== 0) { //do something... } //good if (value) { //do something... }
js中所有 非零 數字作布爾運算時,都會返回 true, 反之返回 false。
Demo . 5
//bad if (user.id === 10) { if (user.name !== "") { if (user.email === "email") { //do something... } } } //good if(user.id === 10 && user.name !=="" && user.email === "email") { //do something... } //good if (user.id !== 10) return; if (user.name === "") return; if (user.email !== "email") return; //do something...
多層條件嵌套,進行 轉換 或 拆分。
Demo . 6
//bad var a = "aa"; var b = "bb"; var c = "cc"; var d; //good var a = "aa", b = "bb", c = "cc", d ;
多個變量的定義,寫一個 var 即可,遵循的原則:被賦值的在前面,只是進行聲明放后面(d 在最后)
Demo . 7
//bad for (var i = 0; i < 100; i++){ str += str; document.getElementById("box").innerHtml = str; } //good for (var i = 0; i < 100; i++) { str += str; } document.getElementById("box").innerHtml = str;
盡可能的減少DOM操作,將DOM操作放在循環體之外,數據處理好后,只執行一次DOM操作即可。
Demo . 8
//bad function test() { var a = b = 1; console.log(a); } //good function test() { var a = 1, b = 1; console.log(a); }
避免使用 連等號 聲明賦值變量。js基礎好點的同學都知道,這里存在着一個坑: b 會被聲明為全局變量,意思就是在 test() 方法之外b也是可以被訪問到的。 全局變量是不推薦使用的,容易污染環境。
Demo . 9
//bad if (age > 20) { console.log("年齡大於20"); } //good (age > 20) && console.log("年齡大於20");
這里的bad並不是說第一種寫法不好,其實就可讀性來說,第一種比第二種更好。 只是第二種寫法更加優雅一點(個人覺得)。 這個句法可能有些同學用的比較少,解釋一下:
如果第一個條件為 true ,那么就執行后面的語句,第一個條件為false, 后面的語句便不會執行。后面的語句可以是表達式,方法,或變量,常量都可以。 比如 (age > 20) && test()。用於賦值時的具體說明,如下圖
Demo . 10
//bad if (age > 20) { value = "similar"; //do something... } //good if (age > 20 && (value = "similar")) { //do something... }
這個可以說是Demo9的變體,代碼可讀性還是第一個比較好,當你采用第二種寫法時,請配合注釋使用。因為有些人可能會認為你這是書寫失誤,少寫了一個 = ,從而他自行給你補上了(value == "similar")。而你實際上是想做賦值操作的。因此你要寫上注釋說明,你這里不是書寫失誤,而是要進行賦值。
注: 根據博友留言的幫助,此處應用需小心,當你為value賦值為空串 或 0 或 null 等等(也就是說,value作布爾運算返回值為 false)的時候,整個判斷表達式會返回 false, 也就不會執行if花括號里面的代碼程序。所以當你不確定 value 會被賦值為什么的時候,建議不要這樣用。
Demo . 11
//bad if (value === "") { value = "similar"; } //good if(!value) { value = "similar"; } //good value = value || "similar";
這個和Demo9的 && 號運算正好相反,當第一個條件為 false 時,執行后面的語句。因為空字符串作布爾運算是返回 false的,所以可以這樣用。
Demo . 12
//bad i = i + 1; i = i - 1; //good i++; i--;
這個沒什么好說的。
Demo . 13
//bad if (typeof str === "String") { } //good if (typeof str === "string") { }
這里只是幫大家填個坑,不存在好壞。typeof 運算是用來檢查數據類型的(常用來檢查js中的基礎類型),它返回的是一個字符串(並且始終為小寫),所以第一個始終為false。 檢查js中的引用類型要用 instanceof 運算, 如: var arr = []; if(arr instanceof Array){}, 但 Function 類型比較特別,也可以用 typeof 來進行判斷。
Demo . 14
//(bad) 格式化字符串 fontSize => font-size function stringFormat(str) { var strArr = str.split(''), len = strArr.length, i = 0; for (; i < len; i++) { if(/^[A-Z]$/.test(strArr[i])) { strArr[i] = "-" + strArr[i].toLowerCase(); } } return strArr.join(''); } //(good) 格式化字符串 fontSize => font-size function stringFormat(str) { return (str.replace(/([A-Z])/g, "-$1")).toLowerCase(); }
兩個方法實現同樣的功能,但第二個優雅得多,性能上也比第一個要好。當對字符串進行循環操作,如:查找、替換。 首先考慮的應該是使用 正則,不應該是循環遍歷。
Demo . 15
//bad function regist(userName, userPwd, userEmail, userPhone) { //do something... } //good function regist(user) { //do something }
當一個方法接收的參數過多的時候,可以考慮將其封裝成一個json對象, 這樣簡單得多。
Demo . 16
var a = 1, b = "1"; //(bad) 輸出 a等於b if (a == b) { console.log("a等於b"); } //(good) 輸出 a不等於b if (a === b) { console.log("a等於b"); } else { console.log("a不等於b"); }
推薦使用 全等 判斷,這樣更准確。 字符串和數字並不是全等的。關於比較的一點說明:
Demo . 17
//bad if (age > 20) { value = "aa"; } else { value = "bb"; } //good value = age > 20 ? "aa" : "bb";
目前只想到這么多,麻煩大家進行補充,感謝!