JS 程式碼的簡單重構與優化
1.返回值
//bad
if(age < 20){
return true;
}else {
return false;
}
//good
return age < 20;
複製程式碼
2.將陣列長度進行儲存,迴圈時就不用每次都讀取一次陣列長度,提升效能。(適用於一次載入20以上的dataList)
//bad
for(var i = 0; i < array.length; i++){
const element = array[i];
}
//good
for(var i = 0; len = array.length; i < len; i++){
const element = array[i];
}
複製程式碼
3.js 中,所有非空字元作布林運算時,都會返回true
,反之返回false
。
//bad
if(value != ""){
//do something
}
//good
if(value){
//do something
}
複製程式碼
4.多層巢狀,進行轉化與拆分
//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;
複製程式碼
5.多個變數定義,寫一個var
即可,遵循的原則,被賦值的寫在前面,只是進行宣告的寫在後面。
//bad
var a = "aa";
var b = "bb";
var c = "cc";
var d;
//good
var a = "aa",
b = "bb",
c = "cc",
d
複製程式碼
6.儘可能的減少DOM操作,將DOM操作放在迴圈體之外,資料處理好後,只執行一次DOM操作即可。
//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;
複製程式碼
7.避免使用 連等號 宣告賦值變數。js基礎好點的同學都知道,這裡存在著一個坑: b 會被宣告為全域性變數,意思就是在 test() 方法之外b也是可以被訪問到的。 全域性變數是不推薦使用的,容易汙染環境。
//bad
function test() {
var a = b = 1;
console.log(a);
}
//good
function test() {
var a = 1,
b = 1;
console.log(a);
}
複製程式碼
8.typeof 運算是用來檢查資料型別的(常用來檢查js中的基礎型別),它返回的是一個字串(並且始終為小寫),所以第一個始終為false。 檢查js中的引用型別要用 instanceof 運算, 如:
`var arr = []; if(arr instanceof Array){}`,
複製程式碼
但 Function 型別比較特別,也可以用 typeof 來進行判斷。
//bad
if (typeof str === "String") {
}
//good
if (typeof str === "string") {
}
複製程式碼
9.兩個方法實現同樣的功能,但第二個優雅得多,效能上也比第一個要好。當對字串進行迴圈操作,如:查詢、替換。 首先考慮的應該是使用 正則,不應該是迴圈遍歷。
//(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])(A-Z)/g, "$1-$2")).toLowerCase();
}
複製程式碼
10.當一個方法接收的引數過多的時候,可以考慮將其封裝成一個json物件, 這樣簡單得多。
//bad
function regist(userName, userPwd, userEmail, userPhone) {
//do something...
}
//good
function regist(user) {
//do something
}
複製程式碼
11.使用三元運算表示式進行if…else的判斷
//bad
if (age > 20) {
value = "aa";
} else {
value = "bb";
}
//good
value = age > 20 ? "aa" : "bb";
複製程式碼