20个提升效率的JS简写技巧,告别屎山!

news2024/11/22 18:10:35

JavaScript 中有很多简写技巧,可以缩短代码长度、减少冗余,并且提高代码的可读性和可维护性。本文将介绍 20 个提升效率的 JS 简写技巧,助你告别屎山,轻松编写优雅的代码!

移除数组假值

可以使用 filter() 结合 Boolean 来简化移除数组假值操作。假值指的是在条件判断中被视为 false 的值,例如 nullundefined、空字符串(""'')、0、NaNfalse

传统写法:

let arr = [12, null, 0, 'xyz', null, -25, NaN, '', undefined, 0.5, false];





let filterArray = arr.filter(value => {

    if(value) {

      return value

    };

}); 

// [12, 'xyz', -25, 0.5]

简化写法:

let arr = [12, null, 0, 'xyz', null, -25, NaN, '', undefined, 0.5, false];



let filterArray = arr.filter(value => Boolean(value)); // [12, 'xyz', -25, 0.5]

更简化写法:

let arr = [12, null, 0, 'xyz', null, -25, NaN, '', undefined, 0.5, false];



let filterArray = arr.filter(Boolean); // [12, 'xyz', -25, 0.5]

Boolean 是 JavaScript 的内置构造函数,通过传递一个值给它,可以将该值转换为布尔值。在这种情况下,Boolean 构造函数作为回调函数传递给 filter() 方法,因此会将每个数组元素转换为布尔值。只有转换结果为真值的元素才会保留在新数组中。

注意:这种方式会将 0 也过滤掉,如果不需要过滤 0,需要进行额外的判断。

数组查找

当对数组进行查找时,indexOf()用于获取查找项的位置。如果未找到该项,则返回值为-1。在JavaScript中,0被视为false,而大于或小于0的数字被视为true。因此,需要这样来写:

传统写法:

if(arr.indexOf(item) > -1) { 



}



if(arr.indexOf(item) === -1) {



}

简化写法:

if(~arr.indexOf(item)) {



}



if(!~arr.indexOf(item)) {



}

位非()运算符对除了-1之外的任何值都返回一个"真"值。对其进行取反就是简单地使用`!即可。另外,也可以使用includes()`函数:

if(arr.includes(item)) {



}

空值合并运算符

空值合并运算符(??)用于为 nullundefined 的变量提供默认值。

传统写法:

const fetchUserData = () => {

    return '前端充电宝';

};



const data = fetchUserData();

const username = data !== null && data !== undefined ? data : 'Guest';


简化写法:

const fetchUserData = () => {

    return '前端充电宝';

};



const data = fetchUserData();

const username = data ?? 'CUGGZ';

除此之外,还有一个空位合并赋值运算符(??=),用于在变量为空(nullundefined)时进行赋值操作。

传统写法:

let variable1 = null;

let variable2 = "前端充电宝";



if (variable1 === null || variable1 === undefined) {

  variable1 = variable2;

}

简化写法:

let variable1 = null;

let variable2 = "前端充电宝";



variable1 ??= variable2;

??= 的写法更加简洁和易读。它首先检查变量 variable1 是否为 nullundefined,如果是,则将它赋值为 variable2 的值。如果 variable1 已经有一个非空的值,那么赋值操作就不会发生。

逻辑或赋值运算符

逻辑或赋值运算符(||=)用于为变量分配默认值。

传统写法:

let count;

if (!count) {

  count = 0;

}

简化写法:

let count;

count ||= 0;

count 为假值(例如 undefined、null、false、0、NaN 或空字符串)时,逻辑或赋值运算符将 count 赋值为 0。否则,它会保留 count 的原始值。

多值匹配

对于多个值的匹配,可以将所有的值放入一个数组中,然后使用 indexOf() 方法进行检查。indexOf() 方法是 JavaScript 数组的一个内置方法,它用于返回指定元素在数组中第一次出现的位置索引。如果数组中不存在该元素,则返回 -1。

传统写法:

if (value === 1 || value === 'one' || value === 2 || value === 'two') {

  // ...

}

简化写法:

if ([1, 'one', 2, 'two'].indexOf(value) >= 0) {

   // ...

}

更简化写法:

if ([1, 'one', 2, 'two'].includes(value)) { 

    // ...

}

三元表达式

使用三元表达式表示可以简化if...else

传统写法:

let isAdmin;

if (user.role === 'admin') {

  isAdmin = true;

} else {

  isAdmin = false;

}


简化写法:

const isAdmin = user.role === 'admin' ? true : false;

更简化写法:

const isAdmin = user.role === 'admin';

短路求值

当将一个变量的值赋给另一个变量时,可能希望确保源变量不为 null、undefined 或空。可以编写一个包含多个条件的长 if 语句,或者使用短路求值来简化。

if (variable1 !== null || variable1 !== undefined || variable1 !== '') {

    let variable2 = variable1;

}

使用短路求值简化后的代码如下:

const variable2 = variable1 || 'new';

对于逻辑或(||)操作符,以下值被视为假:

  • false

  • 0

  • 空字符串("" 或 '')

  • null

  • undefined

  • NaN

所以,如果本身的值可能就是这些中的一个,就不适合使用短路求值。

短路求值还能在函数调用中避免不必要的函数执行。

传统写法:

function fetchData() {

  if (shouldFetchData) {

    return fetchDataFromAPI();

  } else {

    return null;

  }

}

简化写法:

function fetchData() {

  return shouldFetchData && fetchDataFromAPI();

}

shouldFetchData 为真值时,短路求值会继续执行 fetchDataFromAPI() 函数并返回其结果。如果 shouldFetchData 为假值,短路求值会直接返回假值(null),避免了不必要的函数调用。

科学计数法

可以使用科学技术法来表示数字,以省略尾部的零。例如,1e7 实际上表示 1 后面跟着 7 个零。它表示一个十进制,相当于 10,000,000。

传统写法:

for (let i = 0; i < 10000; i++) {}

简化写法:

for (let i = 0; i < 1e7; i++) {}



// 下面的所有比较都将返回 true

1e0 === 1;

1e1 === 10;

1e2 === 100;

1e3 === 1000;

1e4 === 10000;

1e5 === 100000;

位运算符

双位非运算符有一个非常实用的用途,可以用它来替代Math.floor()函数,它在执行相同的操作时速度更快。

传统写法:

Math.floor(4.9) === 4  //true

简化写法:

~~4.9 === 4  //true

指数幂运算

指数幂运算可以使用 ** 来简化。

传统写法:

Math.pow(2,3); // 8

Math.pow(2,2); // 4

Math.pow(4,3); // 64

简化写法:

2**3 // 8

2**4 // 4

4**3 // 64

从 ES7(ECMAScript 2016)开始,JavaScript 引入了指数幂运算符 **,使指数幂运算更加简洁。

双非未运算符

在 JavaScript 中,双非位运算符 ~~ 可以用于将数字向下取整,类似于 Math.floor() 方法的功能。

传统写法:

const floor = Math.floor(6.8); // 6

简化写法:

const floor = ~~6.8; // 6

注意:双非位运算符只适用于 32 位整数,即范围为 -(2^31) 到 (2^31)-1,即 -2147483648 到 2147483647。对于大于 2147483647 或小于 0 的数字,双非位运算符(~~)会给出错误的结果,因此建议在这种情况下使用 Math.floor() 方法。

对象属性

ES6 提供了一种更简洁的方式来给对象赋值属性。如果变量名与对象的键名相同,可以利用简写符号来进行赋值。

传统写法:

const name = '微信公众号:前端充电宝';

const age = 18;



const person = {

  name: name,

  age: age

};

简化写法:

const name = '微信公众号:前端充电宝';

const age = 30;



const person = {

  name,

  age

};

箭头函数

箭头函数可以简化经典函数的写法。

传统写法:

function sayHello(name) {

  console.log('Hello', name);

}



setTimeout(function() {

  console.log('Loaded')

}, 2000);



list.forEach(function(item) {

  console.log(item);

});

简化写法:

sayHello = name => console.log('Hello', name);



setTimeout(() => console.log('Loaded'), 2000);



list.forEach(item => console.log(item));

如果箭头函数只有一条语句,它会隐式地返回其求值的结果,这时可以省略 return 关键字:

传统写法:

function calcCircumference(diameter) {

  return Math.PI * diameter

}


简化写法:

calcCircumference = diameter => (

  Math.PI * diameter;

)

参数解构

如果正在使用一些流行的 Web 框架,比如 React、Vue,可能会使用数组或对象字面量形式的数据来在组件之间传递信息。在组件中要想使用数据对象,就需要对其进行解构。

传统写法:

const observable = require('mobx/observable');

const action = require('mobx/action');

const runInAction = require('mobx/runInAction');



const store = this.props.store;

const form = this.props.form;

const loading = this.props.loading;

const errors = this.props.errors;

const entity = this.props.entity;

简化写法:

import { observable, action, runInAction } from 'mobx';



const { store, form, loading, errors, entity } = this.props;

还可以为变量赋予新的变量名:

const { store, form, loading, errors, entity:contact } = this.props;

扩展运算符

在ES6中引入的扩展运算符可以简化数组和对象的一些操作。

传统写法:

// 合并数组

const odd = [1, 3, 5];

const nums = [2, 4, 6].concat(odd);

// 克隆数组

const arr = [1, 2, 3, 4];

const arr2 = arr.slice();

简化写法:

// 合并数组

const odd = [1, 3, 5];

const nums = [2, 4, 6, ...odd];

console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]

// 克隆数组

const arr = [1, 2, 3, 4];

const arr2 = [...arr];

concat() 函数不同,可以使用扩展运算符在另一个数组的任意位置插入一个数组。

const odd = [1, 3, 5];

const nums = [2, ...odd, 4, 6];

还可以将扩展运算符与ES6的解构语法结合使用:

const { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 };

console.log(a) // 1

console.log(b) // 2

console.log(z) // { c: 3, d: 4 }

扩展运算符还能用于合并对象:

传统写法:

let fname = { firstName : '前端' };

let lname = { lastName : '充电宝'}

let full_names = Object.assign(fname, lname);

简化写法:

let full_names = {...fname, ...lname};

强制参数

在传统的 JavaScript 写法中,为了确保函数参数被传入一个有效值,我们需要使用条件语句来抛出一个错误。可以通过使用强制参数简写的写法实现相同的逻辑。

传统写法:

function foo(bar) {

  if(bar === undefined) {

    throw new Error('Missing parameter!');

  }

  return bar;

}

简化写法:

mandatory = () => {

  throw new Error('Missing parameter!');

}



foo = (bar = mandatory()) => {

  return bar;

}

这里定义了一个名为 mandatory 的函数,用于抛出一个错误,表示函数参数未被传入。然后,在函数 foo 的参数列表中,使用赋默认值的方式来将 bar 参数设置为 mandatory() 的调用结果,如果 bar 参数未被传入或者传入了假值,就会触发 mandatory() 函数的执行。

转为布尔值

可以使用双重逻辑非操作符将任何值转换为布尔值。

!!23 // TRUE

!!"" // FALSE

!!0 // FALSE

!!{} // TRUE

单一的逻辑非操作符已经可以将值转换为布尔类型并对其进行取反,所以第二个逻辑非操作符会再次对其进行取反,从而将其恢复为原始含义,并保持为布尔类型。

变量交换

可以使用数组解构来轻松实现变量交换。

传统写法(使用临时变量完成两个变量的交换):

let a = 5;

let b = 10;



const temp = a;

a = b;

b = temp;

简化写法(使用数组解构赋值完成两个变量交换):

let a = 5;

let b = 10;



[a, b] = [b, a];

这里创建了一个包含两个元素的数组 [b, a],然后使用数组解构赋值将其中的值分别赋给变量 ab。由于左侧的数组和右侧的数组结构相同,所以两个值会进行交换。

变量声明

当需要同时声明多个变量时,可以使用变量声明的简写方法来节省时间和空间。

传统写法:

let x;

let y;

let z = 3;

简化写法:

let x, y, z = 3;

不过,这个优化有些争议,很多人认为这么写会影响代码的可读性,因为许多变量写到了一行,不如一个变量一行更清晰明了,所以可以选择性采用。

如果有多个变量需要赋相同的值,则可以使用连等来实现。

传统写法:

let a = 100;

let b = 100;

let c = 100;

简化写法:

let a = b = c = 100;

For 循环

JavaScript 中传统的 for 循环语法使用数组的长度作为迭代器来遍历数组。还有很多 for 循环的快捷方式提供了在数组中迭代对象的不同方法,例如:

  • for...of:用于遍历内置字符串、数组、类数组对象、NodeList。

  • for...in:用于访问数组的索引和对对象字面量进行遍历,并记录属性名称和值的字符串。

  • Array.forEach:使用回调函数对数组元素及其索引执行操作。

传统写法:



for (let i = 0; i < arr.length; i++) {

  console.log("item: ", arr[i]);}

}

简化写法:

for (let str of arr) {

  console.log("item: ", str);

}



arr.forEach((str) => {

  console.log("item: ", str);

});



for (let index in arr) {

  console.log(index, arr[index]);

}

对于对象字面量,也可以使用 for...in 来遍历:

const obj = { a: 1, b: 3, c: 5 };



for (let key in obj) {

  console.log(key, obj[key]);

}

往期推荐

VS Code 中使用Git实践,学会了效率翻倍!

微软最热门的10款前端开源项目!

JavaScript 终于原生支持数组分组了!

Next.js 13.5 正式发布,速度大幅提升!

多图预警,前端应该掌握的浏览器调试技巧大揭秘!

竟然可以在一个项目中混用 Vue 和 React?

图解 60 个 CSS 选择器,一网打尽!

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

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

相关文章

东郊到家app小程序开发,上门按摩系统优势

东郊到家APP小程序开发 随着生活节奏的紧张&#xff0c;原本的逛菜市场&#xff0c;现在都是网上下单&#xff0c;现在互联网服务都已经融入到人们生活的各个方面 一、上门按摩预约系统的优势 1、高效 一键预约系统只需保存用户信息&#xff0c;以后只需一键预约即可完成。 2、…

分享一下怎么搭建公众号积分商城小程序

随着微信小程序的日益普及&#xff0c;越来越多的商家开始利用微信公众号和小程序进行营销推广。其中&#xff0c;搭建公众号积分商城小程序是一个非常受欢迎的选择。通过积分商城小程序&#xff0c;商家可以吸引更多的用户关注&#xff0c;提高品牌知名度&#xff0c;促进销售…

三门问题-Swift测试

三门问题&#xff08;Monty Hall problem&#xff09;亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论&#xff0c;大致出自美国的电视游戏节目Lets Make a Deal。问题名字来自该节目的主持人蒙提霍尔&#xff08;Monty Hall&#xff09;。 参赛者会看见三扇关闭了的门&#xf…

Camera Metadata跨进程传递

google camera2的参数设置都是通过CaptureRequest来设置的&#xff0c;相关的对象都实现了Parcelable接口才能进行跨进程传递。 一、整个Metadata的传递 1、CameraDeviceImpl.java 无论是capture还是repeating都会调用到下面的 submitRequestList 方法 mRemoteDevice就是Cam…

得物API元数据中心探索与思考

一、背景 目前市面上针对API的管理平台很多&#xff0c;但由于各种客观因素&#xff0c;这些平台的功能都更多聚焦在API文档的消费侧。而对于API文档的生成都非常依赖开发人员的手动创建&#xff0c;很难保障文档的实时性和有效性。市面上常见的API管理平台&#xff0c;由于缺…

【C++】笔试训练(二)

目录 一、选择题二、编程题1、排序子序列2、倒置字符串 一、选择题 1、1. 使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A %-30.4e B %4.30e C %-3…

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

【二】xxl-job 源码分析

xxl-job 源码分析 简介&#xff1a;阅读优秀的开源项目源码总是一件让人激动的事情&#xff0c;分布式调度平台xxl-job我们在生产环境也是有了很多的实践应用&#xff0c;一款产品使用久了对其实现原理多少有些了解了&#xff0c;今天也是抽出整块的时间来认真分析一下xxl-job的…

RFID技术:钢条加工现场的智能化管理利器

RFID技术&#xff1a;钢条加工现场的智能化管理利器 RFID&#xff08;Radio Frequency Identification&#xff09;技术作为一种非接触式自动识别技术&#xff0c;近年来在工业领域得到广泛应用。本文将探讨RFID在钢条加工现场的应用&#xff0c;包括材料追踪与管理、生产过程…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果&#xff1a; 输入&#xff1a;nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3]&#xff0c;一共有2个 利用枚举法&#xff1a; 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

Redis高可用之持久化、主从复制(附配置实例)

目录 一、Redis高可用1.1 简介1.2 高可用策略 二、Redis 持久化2.1 简介2.2 redis 的 2 种持久化方式2.2.1 RDB持久化2.2.2 AOF持久化 三、Redis主从复制3.1 什么是主从复制&#xff1f;3.2 为什么要用主从复制&#xff1f;3.3 主从复制的特性3.4 主从复制工作原理3.4.1 全量复…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

TextSniper for Mac: 革新您的文本识别体验

你是否曾经需要从图片或扫描文档中提取文本&#xff0c;却苦于没有合适的工具&#xff1f;那么&#xff0c;TextSniper for Mac将是你的完美解决方案。这款文本识别工具将彻底改变你处理图像和扫描文件的方式&#xff0c;让你更快速、更高效地完成任务。 TextSniper for Mac 是…

直流负载箱的使用场景和应用范围是什么?

直流负载箱是用于模拟电子设备负载的测试仪器&#xff0c;用于电源供应器、逆变器、电池等直流电源设备的性能测试和负载仿真&#xff0c;它可以模拟各种负载条件&#xff0c;以便测试和评估电源设备在不同负载情况下的工作性能&#xff0c;直流负载箱的使用场景和应用范围广泛…

Jmeter状态码及请求

Jmeter与LR的区别? 1.都是压测工具&#xff0c;可以用来做性能测试&#xff0c;但是Jmeter比较轻量级。jmeter 是用java语言写的&#xff0c;需要java环境&#xff0c;LR不需要&#xff0c;除非用iavavuser协议 (不用掌握) 2.Jmeter更偏向于功能和技术&#xff0c;LR偏向于业务…

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001 由于第12代英特尔酷睿处理器的16核/24线程配置&#xff0c;Nuvo-9000型号与之前的平台相比&#xff0c;性能大幅提升。它们还支持新的DDR5内存标准&#xff0c;以获得更多内存带宽&#xf…

气传导耳机有哪些品牌?性能不错的气传导耳机分享

​气传导耳机采用空气传导技术&#xff0c;使声音传递更加自然舒适。随着气传导耳机的创新发展&#xff0c;越来越多用户不知道气传导耳机该怎么选了&#xff0c;所以今天我来推荐几款相当不错的气传导耳机给大家参考&#xff0c;享受音乐时不受耳道压力的困扰。 一、NANK南卡…

电力智能化运维平台:提高效率和保障电力系统的稳定运行

随着信息技术、人工智能、物联网的发展&#xff0c;电力系统的规模和复杂性也在不断增长。为了确保电力系统的稳定运行&#xff0c;传统的运维方式已经无法满足需求。电力智能化运维平台应运而生&#xff0c;为电力行业带来了全新的运维模式和技术手段。 电力智能化运维平台…

密歇根大学发布3款生成式AI产品,并应用在教学、日常工作!

密歇根日报消息&#xff0c;美国顶级公立大学-密歇根大学宣布推出3款生成式AI产品UM-GPT、UM-GPT开发包和UM-Maizey&#xff0c;并将其应用在教学、日常工作、学术研究等领域。微软也参与了此次产品研发&#xff0c;并提供技术支持。 密歇根大学将为安娜堡分校、弗林特分校、迪…

重学C++ | std::set 的原理

std::set 是C标准库中的容器之一&#xff0c;它基于红黑树实现。std::set 利用红黑树的特性来实现有序的插入、查找和删除操作&#xff0c;并且具有较好的平均和最坏情况下的时间复杂度。 当向 std::set 插入元素时&#xff0c;它会按照特定的比较函数&#xff08;bool less<…