JS代碼的簡單重構與優化(適合新手)


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";

 

 

 

目前只想到這么多,麻煩大家進行補充,感謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM