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();

看完上面的这么多栗子,小伙伴的思路是不是清晰了很多,在你们的项目里练练手吧。

JS优化技巧,解决冗余代码的更多相关文章

  1. js 奇葩技巧之隐藏代码

    昨天在群看到有人发了个文章叫<“短”化你的代码>,思路非常不错,采用unicode的零宽字符来实现字符隐藏,虽然有字符,可是你却看不见它.这篇文章详细的介绍了这种方法的实现原理,最后还给出 ...

  2. 说几个JS优化技巧吧

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  3. Oracle优化技巧

    现观察线上系统运行发现,线上某些业务查询存在等待时间长问题,后核查发现,部分问题出现在对数据库操作上Cost大部分时间,后根据网上各位前辈提供的优化技巧解决大部分问题,现写下本篇文章,一来巩固加深自己 ...

  4. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  5. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  6. 提高PHP性能的实用方法+40个技巧优化您的PHP代码

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数" ...

  7. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  8. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  9. C#/Net代码精简优化技巧

    (一) 在我们写代码的时候可以使用一些小的技巧来使代码变得更加简洁,易于维护和高效.下面介绍几种在C#/Net中非常有用的一些编程技巧. 1 空操作符(??) 在程序中经常会遇到对字符串或是对象判断n ...

  10. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

随机推荐

  1. 2022-05-28:某公司计划推出一批投资项目。 product[i] = price 表示第 i 个理财项目的投资金额 price 。 客户在按需投资时,需要遵循以下规则: 客户在首次对项目 pr

    2022-05-28:某公司计划推出一批投资项目. product[i] = price 表示第 i 个理财项目的投资金额 price . 客户在按需投资时,需要遵循以下规则: 客户在首次对项目 pr ...

  2. 2022-05-18:假设数组a和数组b为两组信号: 1) length(b) <= length(a); 2) 对于任意0<=i<length(b), 有b[i+1] - b[i] == a[i+1

    2022-05-18:假设数组a和数组b为两组信号: length(b) <= length(a): 对于任意0<=i<length(b), 有b[i+1] - b[i] == a[ ...

  3. Django4全栈进阶之路9 STATIC静态文件路径设置、MEDIA媒体文件路径设置

    在 Django 4 中,可以在 settings.py 文件中设置 STATICFILES_DIRS 来指定应用程序静态文件所在的文件夹路径,设置 STATIC_ROOT 来指定收集所有应用程序静态 ...

  4. 如何在Docker Compose中限制容器的CPU和内存使用?

    最近我在使用开源统计Umami过程中,发现CPU和内存经常占满,导致其它服务都不能正常使用.Umami我使用的docker-compose进行部署,于是打算使用docker-compose限制下容器的 ...

  5. Nodejs 应用编译构建提速建议

    编译构建的整体过程 拉取编译镜像 拉取缓存镜像 拉取项目源码 挂载缓存目录 执行编译命令(用户自定义) 持久化缓存 上传编译镜像 为什么在本地构建就快, 但编译机上很慢 在编辑机上每次的构建环境都是全 ...

  6. 代码随想录算法训练营Day11 栈与队列|20. 有效的括号  1047. 删除字符串中的所有相邻重复项  150. 逆波兰表达式求值

    20.有效的括号 题目链接:20.有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合 ...

  7. 今天在内部 Galaxy 分析平台操作探针引物设计小工具程序,调用 Ensembl API 获取相关序列和信息时,发现官网 MySQL server 异常,报告问题后当天晚上就收到了回复,并且修......

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  8. 前后端分离架构下使用 Sa-Token 完成登录认证

    一.架构分析 目前绝大多数系统都已经采用 "前后端分离" 架构来设计了,传统的Session模式鉴权也不再适合这种架构(或者需要额外写很多的代码来专门适配). Sa-Token 是 ...

  9. RIP动态路由协议配置实验

    项目背景 规划与配置接口 IP地址 AR1: [AR1-GigabitEthernet0/0/0]ip address 20.0.1.1 24 [AR1-GigabitEthernet0/0/1]ip ...

  10. ModelBox实战开发:RK3568实现摄像头虚拟背景

    摘要:本文将使用ModelBox端云协同AI开发套件(RK3568)实现摄像头虚拟背景AI应用的开发. 本文分享自华为云社区<ModelBox开发案例 - RK3568实现摄像头虚拟背景[玩转华 ...