JavaScript中if語句優化和部分語法糖小技巧推薦

前言

  • 在前端日常開發過程中,if else判斷語句使用的次數應該是比較頻繁的了,一些較為複雜的場景,可能會用到很多判斷,在某個代碼塊使用很多if else時,代碼會顯得較為冗餘,閱讀起來不夠清晰。
  • 除了if else,在開發過程中,還經常使用 邏輯運算符 && || 以及三木運算符? : 等。

if else 基本使用

let name = "zhangsan";
if (name === "zhangsan") {
	console.log("zhangsan"); // zhangsan
} else {
	console.log("lisi");
}

簡化if判斷和優化代碼

單行if else

if (name === "zhangsan") console.log("zhangsan");
else console.log("lisi");
		

使用&& || 優化


let userInfo = {
	name: "zhangsan",
};
if (userInfo.name === "zhangsan") {
	console.log("zhangsan");
}
if (!userInfo.age) {
	// userInfo.age--> false age屬性不存在
	console.log("年齡屬性不存在");
}
userInfo.name === "zhangsan" && console.log("zhangsan");
userInfo.age || console.log("年齡屬性不存在"); // 年齡屬性不存在

使用三目運算符優化

let name = "zhangsan";
name === "zhangsan" ? console.log("zhangsan") : console.log("lisi");

合併if


let userObj = { name: "zhangsan", children: { name: "lisi" } };
if (userObj.children) {
  if (userObj.children.name == "lisi") {
    console.log(userObj.children.name);
  }
}
if (userObj.children && userObj.children.name == "lisi")
  console.log(userObj.children.name);

使用includes 或者indexof


let age = "22";
if (age == "22" || age == "24" || age == "25") {
  console.log(age);
}
let ageArray = ["22", "24", "25"];
if (ageArray.includes(age)) {
  console.log(age);
}
if (ageArray.indexOf(age) > -1) {
  console.log(age);
}

使用switch流程 優化 多個if else

let val = "lisi";
switch (val) {
  case "zhangsan":
    console.log(val);
    break;
  case "lisi":
    console.log(val);
    break;
  case "xiaoming":
    console.log(val);
    break;
  case "xiaowang":
    console.log(val);
    break;
  default:
    console.log(val);
}

使用對象 key-value 優化多條if語句

let userArray = [
  { name: "zhangsan" },
  { name: "lisi" },
  { name: "xiaoming" },
  { name: "xiaowang" },
];

// 多重if else
if (userArray.name === "zhangsan") {
  console.log(userArray.name);
} else if (userArray.name === "lisi") {
  console.log(userArray.name);
} else if (userArray.name === "xiaoming") {
  console.log(userArray.name);
} else if (userArray.name === "xiaowang") {
  console.log(userArray.name);
} else {
  console.log("其他用戶");
}

function getUser(username) {
  return userArray.filter((item) => item.name == username)[0];
}
console.log(getUser("zhangsan"));

使用map

let filterUser = function (username) {
  return `名字是${username}`;
};
let userMap = new Map([
  ["zhangsan", filterUser("zhangsan")],
  ["lisi", filterUser("lisi")],
  ["xiaoming", filterUser("xiaoming")],
  ["xiaowang", filterUser("xiaowang")],
]);
console.log(userMap.get("zhangsan"));   // 名字是zhangsan

推薦一些常用的JavaScript語法糖

箭頭函數


/**
 * 箭頭函數
 *
 * */
function userInfo(name, age) {
  return `名字是:${name},年齡是:${age}`;
}
let userInfo = (name, age) => `名字是:${name},年齡是:${age}`;
console.log(userInfo("zhangsan", "23"));

三目運算符處理函數

function log1() {
  console.log(1);
}
function log2() {
  console.log(2);
}
let num = 2;
if (num === 1) {
  log1();
} else {
  log2();
}
num === 1 ? log1() : log2();

函數默認參數處理

let getUser = (name = "zhangsan", age = 23) =>
      `名字是:${name},年齡是:${age}`;

console.log("默認參數", getUser());
console.log("傳參", getUser("lisi", 29));

數據類型轉換

let num1 = +"123";
console.log(num1);

Null、Undefined 布爾值等特殊值處理,使用||結合!

/**
 *
 * Null、Undefined 布爾值等特殊值處理,使用||結合!
 *
 * */
let name1 = undefined;
let name2 = null;
let name3 = true;
let name4 = false;
let name5 = "lisi";
console.log(name1 || "其他人"); // 其他人
console.log(name2 || "其他人"); // 其他人
console.log(name3 || "其他人"); // true
console.log(!name3 || "其他人"); // 其他人
console.log(name4 || "其他人"); // 其他人
console.log(name5 || "其他人"); // lisi
console.log(!name5 || "其他人"); // 其他人

鏈判斷運算符

?.運算符在運算過程中,會首先從左到右執行,左側的對象是否為null或undefined。如果是的,就不再往右邊執行運算,而是返回undefined

更多鏈判斷運算符請參考

鏈判斷運算符

//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining


let user = {
  name: "zhangsan",
  children: { name: "lisi", children: { name: "xiaoming" } },
};
let name1 = user?.name;
let name2 = user?.children?.name;
let name3 = user?.children?.children?.name;
console.log(name1);
console.log(name2);
console.log(name3);

空值合併操作符 ??

概念

  • 空值合併操作符(??)是一個邏輯操作符,當左側的操作數為 null 或者 undefined 時,返回其右側操作數,否則返回左側操作數。
  • 與邏輯或操作符(||)不同,邏輯或操作符會在左側操作數為假值時返回右側操作數。
  • 如果使用 || 來為某些變量設置默認值,可能會遇到意料之外的行為。比如為假值(例如,” 或 0)時。

const foo = null ?? "default string";
const test = undefined ?? "default string";
const test1 = 123 ?? "default string";
console.log(test); // "default string"
console.log(foo); // "default string"
console.log(test1); // 123
const baz = 0 ?? 42;
console.log(baz); // 0
const str = "" ?? 42;
const str1 = "" || 42;
console.log(str); // ""
console.log(str1); // 42

小結

  • 以上就是對於if代碼優化的一些建議,if else 在使用過程中,有時候會相對繁瑣一些,但是也是較為直接的判斷語句
  • 是否優化if語句,還是要根據具體的業務場景,具體去做,需要個人進行判斷
  • JavaScript的語法糖在日常開發過程中,可以省去一些繁瑣的判斷或者說語義化
  • ES6或者更高版本的ECMA語法更新了不少,對於一些語法的擴展,在開發過程中還是提供了不少幫助。

源碼地址

文章博客地址:JavaScript中if語句優化和部分語法糖小技巧推薦

歡迎關注公眾號:程序員布歐,不定期更新一些前端入門文章

創作不易,轉載請註明出處和作者。