前言

  • 在前端日常开发过程中,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

更多链判断运算符请参考

链判断运算符

https://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语句优化和部分语法糖小技巧推荐

欢迎关注公众号:程序员布欧,不定期更新一些前端入门文章

创作不易,转载请注明出处和作者。

JavaScript中if语句优化和部分语法糖小技巧推荐的更多相关文章

  1. How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧

    个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...

  2. JavaScript初学者福利!必须收藏的24条小技巧

    JavaScript初学者福利!必须收藏的24条小技巧 前端小编 发布于 2013-12-15 22:52 查看数: 2343 评论数: 6 帖子模式 这篇文章将回顾JavaScript的知识 !如果 ...

  3. JavaScript中with语句的理解

    with语句的作用是暂时改变作用域链.减少的重复输入. 其语法结构为: with(object){ //statements } 举一个实际例子吧: with(document.forms[0]){ ...

  4. 深入浅析JavaScript中with语句的理解

    JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变 ...

  5. 详解JavaScript中void语句的使用

    void是在JavaScript中的一个重要的关键字可被用作其单操作数之前出现一元运算符,其可以是任何类型. 此运算符指定不需要返回值,进行计算的表达式.它的语法可能是下列之一: <script ...

  6. 优化C/C++代码的小技巧

    说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序中是如何优化C/C++代码的.倒也有一些参考意义,当然有的地方我并不赞同或者说我也不完全理解,原文在 ...

  7. 优化C/C++代码的小技巧(转)

    源:http://www.cnblogs.com/lizhenghn/p/3969531.html 说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序 ...

  8. 让 Java 中 if else 更优雅的几个小技巧

    对于一个高级 crud 工程师‍而言,if else 是写代码时使用频率最高的关键词之一,然而有时过多的 if else 会让我们优雅的 crud 代码显得不那么优雅,并且感到脑壳疼

  9. 优化webpack构建时间的小技巧

    在之前工作的地方,我们一直使用webpck去构建.但是,经过长达四年的更新迭代,每个人都在同一个项目中做了不同的操作和更新,这导致我们生产构建时间达到了惊人的一分半,watch模式的rebuild也达 ...

随机推荐

  1. 遇到的问题之"项目启动加载不出页面"

    已找到解决方案1 需要启动这两个微服务(注意:这个属于个人,你们也可以看看是否关联到相关微服务未启动)

  2. java中请给出例子程序:找出两个数的最大公约数和最小公倍数

    9.2 找出12和8的最大公约数和最小公倍数.     public class Test {     public static void main(String[] args) {         ...

  3. Mybatis 多表实现多对多查询、添加操作

    Mybatis 多表实现多对多查询.添加操作 学习内容: 1. 多对多之添加操作 1.1.需求 1.2.数据库表(多对多数据库设计需要设计中间表) 1.3.类设计 1.4.Mapper 接口和 Map ...

  4. Java实现负载均衡算法--轮询和加权轮询

    1.普通轮询算法 轮询(Round Robin,RR)是依次将用户的访问请求,按循环顺序分配到web服务节点上,从1开始到最后一台服务器节点结束,然后再开始新一轮的循环.这种算法简单,但是没有考虑到每 ...

  5. VS Code失焦时自动保存编辑器内容

    vs code有一个非常好用的功能:就是自动保存. 而且不需要安装什么插件,只需要在编辑器设置就可以了.接下来我们一起来设置吧: 1.打开我们的vs code编辑器.在左下角有个  齿轮图标(管理), ...

  6. Data详细解析

  7. el-table高度问题

    1. 外层容器flex=1,el-table设置属性height="calc(100% - 60px),有时一刷新页面表格高度无限增加,滚动条一直变短 试验过几次后发现是因为el-table ...

  8. angular.js中指令compile与link原理剖析

    在angularJs应用启动之前,它们是以HTML文本形式存在文本编辑器当中.应用启动会进行编译和链接,作用域会同HTML进行绑定.这个过程包含了两个阶段! 编译阶段 在编译的阶段,angularJs ...

  9. eNSP路由器启动#号问题排查

    1.删除拖出来的设备,重新拖出来一台---我用过[有时候好使] 2.确保Ensp的设置-工具-Virtual Box安装目录是否正确--我也遇到过[尤其是卸载掉Virtual Box重装之后] 3.确 ...

  10. .NET 7 Preview 3添加了这些增强功能

    .NET 7 Preview 3 已发布, .NET 7 的第三个预览版包括对可观察性.启动时间.代码生成.GC Region.Native AOT 编译等方面的增强. 有兴趣的用户可以下载适用于 W ...