JS优化技巧,解决冗余代码

这篇具有很好参考价值的文章主要介绍了JS优化技巧,解决冗余代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 使用箭头函数简化函数定义

// 传统函数定义



function add(a, b) {



 return a + b;



 }



  



 // 箭头函数简化



 const add = (a, b) => a + b;

2. 使用解构赋值简化变量声明

// 传统变量声明



const firstName = person.firstName;



const lastName = person.lastName;



// 解构赋值简化



const { firstName, lastName } = person;

3. 使用模板字面量进行字符串拼接

// 传统字符串拼接



const greeting = 'Hello, ' + name + '!';



// 模板字面量简化



const greeting = `Hello, ${name}!`;

4. 使用展开运算符进行数组和对象操作

// 合并数组



const combined = [...array1, ...array2];



// 复制对象



const clone = { ...original };

5. 使用数组的高阶方法简化循环和数据操作

// 遍历数组并返回新数组



const doubled = numbers.map(num => num * 2);



// 过滤数组



const evens = numbers.filter(num => num % 2 === 0);

6. 使用条件运算符简化条件判断

// 传统条件判断



let message;



if (isSuccess) {



 message = 'Operation successful';



} else {



 message = 'Operation failed';



}



// 条件运算符简化



const message = isSuccess ? 'Operation successful' : 'Operation failed';

7. 使用对象解构和默认参数简化函数参数

// 传统参数设置默认值



function greet(name) {



 const finalName = name || 'Guest';



 console.log(`Hello, ${finalName}!`);



 }



  



 // 对象解构和默认参数简化



 function greet({ name = 'Guest' }) {



 console.log(`Hello, ${name}!`);



 }

8. 使用函数式编程概念如纯函数和函数组合

// 纯函数



function add(a, b) {



 return a + b;



 }



  



 // 函数组合



 const multiplyByTwo = value => value * 2;



 const addFive = value => value + 5;



 const result = addFive(multiplyByTwo(3));

9. 使用对象字面量简化对象的创建和定义

// 传统对象创建



const person = {



 firstName: 'John',



 lastName: 'Doe',



 age: 30,



 };



  



 // 对象字面量简化



 const firstName = 'John';



 const lastName = 'Doe';



 const age = 30;



 const person = { firstName, lastName, age };

10. 使用适当的命名和注释来提高代码可读性

// 不好的



const x = 10; // 设置x的值为10



function a(b) {



 return b * 2; // 返回b的两倍



}



// 好的



const speed = 10; // 设置速度为10



function double(value) {



 return value * 2; // 返回输入值的两倍

11. 优雅的写条件判断代码

简单的条件判断逻辑用if else 或者 三元运算符, 一眼看过去还能知道说的啥,但是大量的if else和叠加在一起的三元运算符就是接盘侠的噩梦~~~

给大家上一个三元运算符叠加的案例,我是真实在项目中遇到过,cpu直接干爆~~~

<view>{{status===1?'成功': status===2 ? '失败' : status===3 ? '进行中' : '未开始' }}</view>

大概是这样的,具体的项目代码不好放在这里,小伙伴们意会就行。

复杂逻辑推荐使用对象Map写法,符合人脑的逻辑,可读性高,看着舒服~~~

1,普通的if else

let txt = '';



if (falg) {



 txt = "成功"



} else {



 txt = "失败"



}

2,三元运算符

let txt = flag ? "成功" : "失败";

3,多个if else

// param {status} status 活动状态:1:成功 2:失败 3:进行中 4:未开始



let txt = '';



if (status == 1) {



 txt = "成功";



} else if (status == 2) {



 txt = "失败";



} else if (status == 3) {



 txt = "进行中";



} else {



 txt = "未开始";



}

4,switch case

let txt = '';



switch (status) {



 case 1:



 txt = "成功";



 break;



 case 2:



 txt = "成功";



 break;



 case 3:



 txt = "进行中";



 break;



 default:



 txt = "未开始";



}

5,对象写法

const statusMap = {



 1: "成功",



 2: "失败",



 3: "进行中",



 4: "未开始"



}



//调用直接 statusMapp[status]

5,Map写法

const actions = new Map([



 [1, "成功"],



 [2, "失败"],



 [3, "进行中"],



 [4, "未开始"]



])



// 调用直接 actions.get(status)

12. 封装条件语句

同上,if里的条件越多越不利于接盘侠的维护,不利于人脑的理解,一眼看过去又是一堆逻辑。多个逻辑应该化零为整

大脑:'别来碰我,让我静静'



// 不好的



if (fsm.state === 'fetching' && isEmpty(listNode)) {



 // ...



}



// 好的



shouldShowSpinner(fsm, listNode){



 return fsm.state === 'fetching' && isEmpty(listNode)



}



if(shouldShowSpinner(fsm, listNode)){



 //...doSomething



}

13. 函数应该只做一件事

函数式写法推崇柯里化, 一个函数一个功能,可拆分可组装。

// 不好的



function createFile(name, temp) {



 if (temp) {



   fs.create(`./temp/${name}`);



 } else {



   fs.create(name);



 }



}



// 好的



function createFile(name) {



 fs.create(name);



}



function createTempFile(name) {



 createFile(`./temp/${name}`)



}

再来一个栗子

函数要做的事情如下:

  • 遍历clients数组
  • 遍历过程中,通过lookup函数得到一个新的对象clientRecord
  • 判断clientRecord对象中isActive函数返回的是不是true,
    • isActive函数返回true,执行email函数并把当前成员带过去
// 不好的



function emailClients(clients) {



 clients.forEach((client) => {



   const clientRecord = database.lookup(client);



   if (clientRecord.isActive()) {



     email(client);



   }



 });



}



// 好的



function emailClients(clients) {



 clients



   .filter(isClientRecord)



   .forEach(email)



}



function isClientRecord(client) {



 const clientRecord = database.lookup(client);



 return clientRecord.isActive()



}

上面不好的栗子一眼看过去是不是感觉一堆代码在那,一时半会甚至不想去看了。

好的栗子,是不是逻辑很清晰,易读。

  • 巧用filter函数,把filter的回调单开一个函数进行条件处理,返回符合条件的数据
  • 符合条件的数据再巧用forEach,执行email函数

14. Object.assign给默认对象赋默认值

// 不好的



const menuConfig = {



 title: null,



 body: 'Bar',



 buttonText: null,



 cancellable: true



};



function createMenu(config) {



 config.title = config.title || 'Foo';



 config.body = config.body || 'Bar';



 config.buttonText = config.buttonText || 'Baz';



 config.cancellable = config.cancellable === undefined ?



 config.cancellable : true;



}



createMenu(menuConfig);



// 好的



const menuConfig = {



 title: 'Order',



 buttonText: 'Send',



 cancellable: true



};



function createMenu(config) {



 Object.assign({



   title: 'Foo',



   body: 'Bar',



   buttonText: 'Baz',



   cancellable: true 



 }, config)



}



createMenu(menuConfig);

15. 函数参数两个以下最好

说一千道一万,就是为了优雅,就是为了可读性好。

// 不好的



function createMenu(title, body, buttonText, cancellable) {



 // ...



}



// 好的



const menuConfig = {



 title: 'Foo',



 body: 'Bar',



 buttonText: 'Baz',



 cancellable: true



};



function createMenu(config){



 // ...



}



createMenu(menuConfig)

16. 使用解释性的变量

省流,用了扩展运算符,为了可读性(saveCityZipCode(city, zipCode)可读性很好,知道参数是干嘛的)

// 不好的



const address = 'One Infinite Loop, Cupertino 95014';



const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;



saveCityZipCode(address.match(cityZipCodeRegex)[1], address.match(cityZipCodeRegex)[2]);



// 好的



const address = 'One Infinite Loop, Cupertino 95014';



const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;



cosnt [, city, zipCode] = address.match(cityZipCodeRegex) || [];



saveCityZipCode(city, zipCode)

想对类中的属性进行更多自定义取/增/改的操作时,使用set/get

第一次见这个写法,不知道是啥意思的小伙伴,把他当成vue2中的defineProperty

Object.defineProperty(data1,'age',{



 set:function(newAge){



   console.log(this.name+'现在'+newAge+'岁')



 },



 get:function(){



   return 18;



 }



})

是一个意思,赋值的时候set会被触发,取值的时候get会被触发。

巧用自带属性,提升性能。

class BankAccount {



 constructor(balance = 1000) {



   this._balance = balance;



 }



 // It doesn't have to be prefixed with `get` or `set` to be a



 //getter/setter



 set balance(amount) {



   console.log('set')



   if (verifyIfAmountCanBeSetted(amount)) {



     this._balance = amount;



   }



 }



 get balance() {



   console.log('get')



   return this._balance;



 }



 verifyIfAmountCanBeSetted(val) {



   // ...



 }



}



const bankAccount = new BankAccount();



// Buy shoes...



bankAccount.balance -= 100;



// Get balance



let balance = bankAccount.balance;

17. 让对象拥有私有成员-通过闭包来实现

闭包天生就是做私有化的

// 不好的



const Employee = function(name) {



 this.name = name;



};



Employee.prototype.getName = function getName() {



 return this.name;



};



const employee = new Employee('John Doe');



console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe



delete employee.name;



console.log(`Employee name: ${employee.getName()}`); // Employee name: undefined



// 好的



const Employee = function(name){



 this.getName = function(){



   return name



 }



}



const employee = new Employee('John Doe');



console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe



delete employee.name;



console.log(`Employee name: ${employee.getName()}`); // Employee name: undefined

第一个示例

优点:

  • 通过原型链共享方法,节省了内存空间。所有实例对象共享同一个 getName 方法,而不是每个实例对象都创建一个独立的方法。

缺点:

  • 在构造函数中无法直接定义私有属性或方法,所有属性和方法都会被暴露在原型链上

第二个示例

优点:

  • 可以在构造函数内部定义私有属性和方法,不会暴露在对象的原型链上,提供了更好的封装性。

缺点:

  • 每次创建实例对象时,都会创建一个独立的方法,每个实例对象都有自己的 getName 方法,占用更多的内存空间。

18. 使用方法链

链式写法也是代码优雅之道的重头戏。

ps:发明这个的程序员肯定是后端出身的,这种写法在PHP的CI框架中见过。

// 不好的



class Car {



 constructor() {



   this.make = 'Honda';



   this.model = 'Accord';



   this.color = 'white';



 }



 setMake(make) {



   this.make = make;



 }



 save() {



   console.log(this.make, this.model, this.color);



 }



}



const car = new Car();



car.setMake('Ford');



car.save();



// 好的



class Car {



 constructor() {



   this.make = 'Honda';



   this.model = 'Accord';



   this.color = 'white';



 }



 setMake(make) {



   this.make = make;



   // NOTE: return this是为了用链式写法



   return this;



 }



 save() {



   console.log(this.make, this.model, this.color);



   // NOTE:return this是为了用链式写法



   return this;



 }



}



const car = new Car()



 .setMake('Ford')



 .save();

看完上面的这么多栗子,小伙伴的思路是不是清晰了很多,在你们的项目里练练手吧。文章来源地址https://www.toymoban.com/news/detail-622262.html

到了这里,关于JS优化技巧,解决冗余代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

    前言 博主主页👉🏻蜡笔雏田学代码 专栏链接👉🏻【前端面试专栏】 今天继续学习前端面试题相关的知识! 感兴趣的小伙伴一起来看看吧~🤞 addEventListener()方法,用于向指定元素添加事件句柄,它可以更简单的控制事件。语 法为: 第一个参数是 事件的类型 (如 “click”

    2024年01月19日
    浏览(44)
  • 优化MATLAB中quiver函数绘制箭头图或矢量图(1)-MATLAB开发

    Matlab的基本数据单位是矩阵,利用Matlab可以较方便得绘制向量分布图,比如空气流的采样数据;函数的梯度;曲面的法线向量等等。Matlab自带的quiver和quiver3函数可以满足这一需求,但是箭头的箭型较为简单,这里主要目的即是进一步绘制更好看的矢量图。 Matlab中自带的quiv

    2023年04月21日
    浏览(76)
  • Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

    我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一,就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能,但是其中存在很多冗余的方法 打开这3个文件我们可以看到他们的入口函数dispatcher  实际的代码相似度

    2024年02月06日
    浏览(45)
  • ES6系列之let、const、箭头函数使用的坑

    变量提升 块级作用域的重要性 箭头函数this的指向 rest参数和arguments Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持。  上面的原始代码用了箭头函数,Babel将其转

    2024年02月14日
    浏览(40)
  • 一份Node.js性能优化技巧指南

    你是一个踏入后端开发领域的前端爱好者吗?🤔 准备好迎接在Node.js错综复杂的景观中惊险刺激的旅程吧!🎢 在这个探险中,我们将探索后端的无数奇迹,从使用Node.js框架快速创建自己的后端,到应对性能分析、测试,深入内存管理。💻🔍 加入我们,揭开C++插件的奥秘,征服子进程

    2024年02月21日
    浏览(45)
  • Node.js性能优化:实用技巧和最佳实践

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,广泛用于构建快速的、可扩展的网络应用。尽管 Node.js 已经为处理大量并发连接提供了强大的性能,但在实际开发中仍然需要采取一些策略来优化性能和提升应用响应速度。以下是一些实用的技巧和最佳实践,可以帮助开发

    2024年04月17日
    浏览(40)
  • 优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南

    DMA 代表直接内存访问。这意味着应用程序可以在 CPU 干预的情况下直接访问(读/写)主机内存。如果您在主机之间执行此操作,它将成为远程直接内存访问 (RDMA) 在阅读有关 RDMA 的内容时,您会注意到一些用于描述其优点的术语。 “零复制 Zero Copy”、“内核绕过 Kernel Bypas

    2024年02月03日
    浏览(51)
  • 提高代码效率的6个Python内存优化技巧

    当项目变得越来越大时,有效地管理计算资源是一个不可避免的需求。Python与C或c++等低级语言相比,似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用,这些方法可能在实际应用中并没有人注意,所以本文将重点介绍Python的内置机制,掌握它们将大

    2024年01月18日
    浏览(42)
  • JS面向对象:四.构造函数优化

    将 showName 函数定义移出了 Flower 构造函数,并在构造函数中直接引用了该函数。这种优化方式可以避免在每个对象实例化时都创建一个新的 showName 函数,而是共享同一个函数,节省了内存空间。

    2024年02月19日
    浏览(29)
  • 每个前端应该掌握的7个代码优化的小技巧

    在写代码时我们经常会遇到这样的需求,我们需要检查某个字符串是否是符合我们的规定的字符串之一。最常见的方法就是使用 || 和 === 去进行判断匹配。但是如果大量的使用这种判断方式,定然会使得我们的代码变得十分臃肿,写起来也是十分累。其实我们可以使用 Array

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包