20 个超级有用的 JavaScript 技巧,让你的工作更轻松

今天这篇文章,我将跟大家分享20个我自己收藏使用的JavaScript技巧,希望今天这篇文章里的内容能够帮助到你,让你的工作更高效!更轻松!我们现在开始吧。

1. 多条件 if 语句

将多个值放入一个数组中,然后调用该数组的 include 方法。

// bad
if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") {//logic
}// better
if (["abc", "def", "ghi", "jkl"].includes(x)) { //logic
}
2. 简化 if true…else 条件表达式
// bad
let test: boolean;
if (x > 100) {  test = true;} else {  test = false;
}// better
let test = x > 10 ? true : false;//or let test = x > 10;console.log(test);
3. 假值(undefined, null, 0, false, NaN, empty string)检查

当我们创建一个新变量时,有时我们想检查引用的变量是否是一个假值,例如 null 或 undefined 或空字符串。JavaScript 确实为这种检查提供了一个很好的快捷方式——逻辑 OR 运算符 (||)

|| 仅当左侧为空或 NaN 或 null 或 undefined 或 false 时,如果左侧操作数为假,则将返回右侧操作数,逻辑或运算符 ( || ) 将返回右侧的值。

// bad
if (test1 !== null || test1 !== undefined || test1 !== "") {  let test2 = test1;
}// better
let test2 = test1 || "";// bad
if (test1 === true) or if (test1 !== "") or if (test1 !== null)// better
if (test1){  // do some}else{  // do other
}//Note: If test1 has a value, the logic after if will be executed. //This operator is mainly used for null, undefined, and empty string checks.
4. null/undefined 检查和默认赋值
//null checking and default assignmentlet test1 = null;
let test2 = test1 ?? "";console.log("null check", test2); // output empty string ""//undefined checking and default assignmentconst test = undefined ?? "default";
console.log(test);// expected output: "default"
5. 获取列表中的最后一项

在其他语言中,此功能被制成可以在数组上调用的方法或函数,但在 JavaScript 中,你必须自己做一些工作。

let array = [0, 1, 2, 3, 4, 5, 6, 7];console.log(array.slice(-1)) >>> [7];
console.log(array.slice(-2)) >>> [6, 7];
console.log(array.slice(-3)) >>> [5, 6, 7];function lastItem(list) { if (Array.isArray(list)) {    return list.slice(-1)[0];  }if (list instanceof Set) {    return Array.from(list).slice(-1)[0];  }if (list instanceof Map) {    return Array.from(list.values()).slice(-1)[0];  }}
6.比较后返回
// bad
let test;
function checkReturn() {  
if (!(test === undefined)) {    return test;  } else {    return callMe("test");  }
}// better
function checkReturn() {  return test ?? callMe("test");}
7. 使用可选的链接运算符 -?。

? 也称为链判断运算,它允许开发人员读取深度嵌套在对象链中的属性值,而无需验证每个引用,当引用为空时,表达式停止计算并返回 undefined。

const travelPlans = {        destination: "DC",        monday: {            location: "National Mall",            budget: 200,        },    };// bad    
const res = travelPlans && travelPlans.tuesday && travelPlans.tuesday.location && travelPlans.tuesday.location.href;    
console.log(res);  // Result: undefined// better    
const res1 = travelPlans?.tuesday?.location?.href;    
console.log(res1);  // Result: undefined
8. 多个条件的 && 运算符

要仅在变量为真时调用函数,请使用 && 运算符。

// bad
if (test) {  callMethod();}// better
test && callMethod();

当你想在 React 中有条件地渲染组件时,这对于使用 (&&) 进行短路很有用。例如:

<div> {this.state.isLoading && <Loading />} </div>
9.开关简化

我们可以将条件存储在键值对象中,并根据条件调用它们。

// bad
switch (data) {  case 1:    test1();    break;  case 2:    test2();    break;  case 3:    test();    break;    // And so on...}// better
var data = {  1: test1,  2: test2,  3: test,};
// If type exists in data, execute the corresponding function
data[type] && data[type]();
10.默认参数值
// bad
function add(test1, test2) {  if (test1 === undefined) test1 = 1;  if (test2 === undefined) test2 = 2;  return test1 + test2;}// better
add = (test1 = 1, test2 = 2) => test1 + test2;add(); //output: 3
11. 条件查找简化

如果我们想根据不同的类型调用不同的方法,我们可以使用多个 else if 语句或开关,但是还有比这更好的简化技巧吗?其实和之前的switch简化是一样的。

// bad
if (type === "test1") {  test1();} else if (type === "test2") {  test2();} else if (type === "test3") {  test3();} else if (type === "test4") {  test4();} else {  throw new Error("Invalid value " + type);
}// better
var types = {  test1,  test2,  test3,  test4,};types[type] && types[type]();
12. 对象属性赋值
let test1 = "a";let test2 = "b";
// bad
let obj = { test1: test1, test2: test2 };// better
let obj = { test1, test2 };
13. 解构赋值
// bad
const test1 = this.data.test1;
const test2 = this.data.test2;
const test3 = this.data.test3;// better
const { test1, test2, test3 } = this.data;
14. 模板字符串

如果你厌倦了使用 + 将多个变量连接成一个字符串,这个简化技巧会让你头疼。

// bad
const welcome = "Hi " + test1 + " " + test2 + ".";// better
const welcome = `Hi ${test1} ${test2}`;
15. 跨越字符串
// bad    
const data =       "hello maxwell this is a test\n\t" + "test test,test test test test\n\t";     // better    
const data = `hello maxwell this is a test                    test test,test test test test`;
16. indexOf的按位化简

在数组中查找某个值时,我们可以使用 indexOf() 方法。但是还有更好的方法,我们来看这个例子。

// bad
if (arr.indexOf(item) > -1) {  // item found
}
if (arr.indexOf(item) === -1) {  // item not found
}// better
if (~arr.indexOf(item)) {  // item found
}
if (!~arr.indexOf(item)) {  
// item not found
}//The bitwise (~) operator will return true (except for -1), //the reverse operation only requires !~. Alternatively, the includes() function can be used.
if (arr.includes(item)) {  // true if the item found
}
17. 将字符串转换为数字

有诸如 parseInt 和 parseFloat 等内置方法可用于将字符串转换为数字。我们也可以简单地通过在字符串前面提供一元运算符 (+) 来做到这一点。

// bad
let total = parseInt("583");
let average = parseFloat("32.5");// better
let total = +"583";
let average = +"32.5";
18. 按顺序执行 Promise

如果你有一堆异步或普通函数都返回要求你一个一个执行它们的Promise怎么办?

async function getData() {        
const promises = [fetch("url1"), fetch("url2"), fetch("url3"), fetch("url4")];        
for (const item of promises) {            
// Print out the promise            
console.log(item);        
}// better        
for await (const item of promises) {            // Print out the results of the request            console.log(item);        }    
}

等待所有Promiae完成。

Promise.allSettled() 方法接受一组 Promise 实例作为参数,包装到一个新的 Promise 实例中。在所有这些参数实例都返回结果(已完成或已拒绝)之前,包装器实例不会结束。

有时候,我们并不关心异步请求的结果,我们只关心是否所有请求都结束了。这时候,Promise.allSettled() 方法就非常有用了。

const promises = [fetch("index.html"), fetch("https://does-not-exist/")];const results = await Promise.allSettled(promises);// Filter out successful requests
const successfulPromises = results.filter((p) => p.status === "fulfilled");// Filter out failed requests and output the reason
const errors = results.filter((p) => p.status === "rejected").map((p) => p.reason);
19.交换数组元素的位置
// bad
const swapWay = (arr, i, j) => {  const newArr = [...arr];let temp = newArr[i];newArr[i] = list[j];  newArr[j] = temp;return newArr;};//Since ES6, swapping values from different locations in an array has become much easier// better
const swapWay = (arr, i, j) => {  const newArr = [...arr];const [newArr[j],newArr[i]] = [newArr[i],newArr[j]];return newArr;};
20. 带范围的随机数生成器

有时你需要生成随机数,但又希望数字在一定范围内,则可以使用此工具。

function randomNumber(max = 1, min = 0) {  if (min >= max) {    return max;  }return Math.floor(Math.random() * (max - min) + min);
}
生成随机颜色
function getRandomColor() {  const colorAngle = Math.floor(Math.random() * 360);  return `hsla(${colorAngle},100%,50%,1)`;
}

到这里,我要跟你分享的20 个 JavaScript 的小技巧就结束了,希望这些小技巧对你有用。

写在最后

在前面我也跟大家分享过很多这样的小技巧,不知道大家是否学会了没有?如果你没有学会的话,请记得多看看,暂时用不上的一些技巧,可以自行收藏起来。

同时,也要整理一份属于自己的使用技巧笔记。

如果你觉得我今天跟你分享的内容有帮助的话,请记得点赞我,关注我,并将其分享给你的开发者朋友,也许能够帮助到他。

以上就是我今天跟你分享的全部内容,感谢你的阅读,编程愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 主从复制及哨兵模式

目录 1 Redis 主从复制 1.1 主从复制的作用 1.2 主从复制流程 2 搭建Redis 主从复制 2.1 安装 Redis 2.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 2.3 修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.4 验证主从效果 3 Redis 哨兵模…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

horizontal image flip(Neon优化)

1、原始代码 这个代码非常简单,就是将同一行的像素进行反转,我们需要注意,这里的像素是RGBA,因此一个像素共32位 uint32_t line; // 1. For an image of width w and height h, for all lines in the image, do the following. for (line = 0; line < h; line++) {uin…

JAVA开发中常用RDMS

一、前言 JAVA的开发离不开数据库的支持&#xff0c;常见的有关系型数据库和非关系型数据库。java除了处理不依赖与数据库的通信技术。很多的java项目或者应用程序都需要建立在数据库的基础上。所以java开发早已经不是单纯的java开发&#xff0c;更多的是基于对数据的处理&…

一文教你如何快速备考云计算HCIE 3.0 !

大家好&#xff0c;在誉天实验辅导老师的耐心帮助下&#xff0c;本人在9月21日的云计算HCIE 3.0考试已顺利通过&#xff0c;很高兴有这个机会给大家分享备考的经历&#xff0c;希望对还在备考的同学能有一定的帮助。 备考准备 在云计算HCIE3.0的课程学习结束之后&#xff0c;就…

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项…

一款构建Python命令行应用的开源库

1 简介 当我们编写 Python 程序时&#xff0c;我们经常需要与用户进行交互&#xff0c;接收输入并输出结果。Python 提供了许多方法来实现这一点&#xff0c;其中一个非常方便的方法是使用 typer 库。typer 是一个用于构建命令行应用程序的 Python 库&#xff0c;它使得创建命令…

使用MATLAB进行傅里叶变换

1、定义 T1;% 周期0-1 N20;% 最大谐波 k-N:N;% -20:20——-20表示a_(20)e^(j*20*w0*t) N1length(k);%N141 % ceil(N1/2)21%即21是N1的中位数tlinspace(0,T,100); Ntlength(t); ttlinspace(-4*T,4*T,1024); Nttlength(tt);2、原函数 w02*pi/T; % 0-T xt(t>T/4).* 1.0; fig…

嵌入式学习笔记(49)由I2C学通信时序

10.2.1什么是时序&#xff1f; 字面意思&#xff0c;时序就是时间顺序&#xff0c;实际上在通信中时序就是通信线上按照时间顺序发生的电平变化&#xff0c;以及这些变化对通信的意义就叫时序。 10.2.2 I2C总线空闲状态、起始位、结束位 (1)I2C总线上有1个主设备&#xff0c…

二叉树的顺序存储——堆——初识堆排序

前面我们学过可以把完全二叉树存入到顺序表中&#xff0c;然后利用完全二叉树的情缘关系&#xff0c;就可以通过数组下标来联系。 但是并不是把二叉树存入到数组中就是堆了&#xff0c;要看原原来的二叉树是否满足&#xff1a;所有的父都小于等于子&#xff0c;或者所有的父都…

2023年铷铁硼行业分析:低端供应过剩,高性能材料供应不足[图]

铷铁硼材料是一种Fe基磁性材料&#xff0c;主要由钕铁硼按一定比例组成的四方晶体结构&#xff0c;其中Fe元素约占总质量的三分之二&#xff0c;Nd元素约占总量的三分之一&#xff0c;而B等含量最少&#xff0c;约占1%。铷铁硼是现今磁性最强的永久磁铁&#xff0c;也是最常使用…

记录vue开发实例

封装的表格组件 <template><div><div style"width: 100%" v-if"showList"><el-table v-loading.lock"loading" :data"dataList":header-cell-style"{background: #F2FCFE,fontSize: 14px,color: #50606D}&…

sed 命令

sed是Stream Editor&#xff08;字符流编辑器&#xff09;的缩写&#xff0c;简称流编辑器。 sed 命令是一个面向行处理的工具&#xff0c;它以“行”为处理单位&#xff0c;针对每一行进行处理&#xff0c;处理后的结果会输出到标准输出stdout。sed 命令是很懂礼貌的一个命令&…

腾讯云/阿里云国际站代理:阿里云、华为云和腾讯云“大展拳脚”,与国际巨头未来竞争焦点是AI计算?

国内云计算市场重新掀起的价格战&#xff0c;腾讯云国际站代理让竞争本就内卷的市场陷入白热化&#xff0c;中国云厂商深耕东南亚的意愿变强。2020年之后&#xff0c;上下游企业与中国云厂商抱团出海趋势明显。东软集团、用友网络等A股上市公司也在走向东南亚。 东南亚市场蛋糕…

【微服务】七. http客户端Feign

7.1 基于Feign远程调用 RestTimeplate方式调用存在的问题 先来看以前利用RestTemplate发起远程调用的代码&#xff1a; String url "http://userservice/user"order.getUserId(); User user restTemplate.getForObject(url,User.class);存在下面的问题&#xf…

世界前沿技术发展报告2023《世界信息技术发展报告》(六)网络与通信技术

&#xff08;六&#xff09;网络与通信技术 1. 概述2. 5G与光通讯2.1 美国研究人员利用电磁拓扑绝缘体使5G频谱带宽翻倍2.2 日本东京工业大学推出可接入5G网络的高频收发器2.3 美国得克萨斯农工大学通过波束管理改进5G毫米波通信2.4 联发科完成全球首次5G NTN卫星手机连线测试2…

SpringBoot, EventListener事件监听的使用

1、背景 在开发工作中&#xff0c;会遇到一种场景&#xff0c;做完某一件事情以后&#xff0c;需要广播一些消息或者通知&#xff0c;告诉其他的模块进行一些事件处理&#xff0c;一般来说&#xff0c;可以一个一个发送请求去通知&#xff0c;但是有一种更好的方式&#xff0c;…

软考 系统架构设计师系列知识点之软件架构风格(5)

接前一篇文章&#xff1a;考 系统架构设计师系列知识点之软件架构风格&#xff08;4&#xff09; 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此8天…

【WinRAR】去除请购买WinRAR许可

新建rarreg.key文件 在WinRAR安装目录新建rarreg.key文件&#xff0c;文件内容如下: RAR registration datawncnUnlimited Company LicenseUID1b064ef8b57de3ae9b5264122122509b52e35fd885373b214a4a64cc2fc1284b77ed14fa2066ebfca6509f9813b32960fce6cb5ffde62890079861be57…

MONGO常用操作指令

配置&#xff1a; // 结果50行为1批展示 DBQuery.shellBatchSize 50 创建&#xff1a; // 创建表 db.createCollection(table_name) // 创建索引&#xff08;unique可选 是否唯一索引&#xff09; db.getCollection("table_name").createIndex({column1: 1, colu…