前端代码规范 - JavaScript 部分规范

JavaScript 是实现交互性和动态功能的关键语言。为了确保代码的可读性、可维护性和性能,遵循一定的编码规范至关重要。

  • 命名规范
  • 强类型设计
  • 函数设计
    • 单一职责
    • 函数命名规范
    • 参数长度
    • 默认参数
    • 纯函数
  • 性能优化
    • 减少DOM操作
  • 提升JavaScript代码质量
    • 避免嵌套循环
    • 使用map、filter和reduce替代for循环
    • 使用解构赋值简化代码
    • 多条件if判断
    • 使用默认参数值
    • 简化 if true else 条件表达式
    • indexOf的更简单写法
    • switch语句简化
    • 提前return
    • 可选链运算符?.
    • 多条件&&运算符
    • 使用数字分隔符增强可读性
    • 字符串转换数字
    • 提升控制台输出的清晰度
    • 数组截断技巧

命名规范

使用有意义且一致的命名方式,提高代码的可读性。

在这里插入代码片// 错误示例:难以理解的命名
let n = 20; // 代表什么?
let d = new Date();

// 正确示例:清晰的命名
let maxRetryCount = 20;
let currentDate = new Date();

一致的命名方式有助于团队协作和代码理解。

// 变量命名:使用驼峰命名法
let smallApple;

// 常量命名:使用全大写字母,单词间用下划线分隔
const SMALL_APPLE;

// 类命名:采用Pascal命名法,方法和属性使用驼峰命名法
class SmallApple {
    constructor() {
        this.color = 'green';
    }
    // 类的方法
    eat() {
        console.log('Eating the apple.');
    }
}

// 枚举命名:使用Pascal命名法,属性全部大写并用下划线分隔
const enum Fruits {
    APPLE,
    BANANA,
    ORANGE
}

// 布尔类型:以 is 或 has 开头
let isReady;

// 私有成员:以下划线 _ 开头
class Example {
    _privateMethod() {
        // ...
    }
}

强类型设计

避免使用隐式类型转换,明确数据类型的转换,明确数据类型可以减少运行时错误。

// 布尔属性:避免使用数字来表示布尔值
let isAvailable = true;

// 数据转换:对于从DOM获取的字符串类型数据,应在适当时候转换为预期的类型
const input = document.getElementById('input').value;
const inputValue = parseInt(input, 10);

// 错误示例:隐式类型转换
let result = "3" + 4; // 结果为字符串 "34"

// 正确示例:显式类型转换
let result = parseInt("3", 10) + 4; // 结果为数字 7

函数设计

函数是构建模块化、可维护代码的基础。良好的函数设计可以提高代码的可读性、易用性和可扩展性。以下是JavaScript函数设计的一些最佳实践和规范,以及如何应用这些规范的代码示例。

单一职责

每个函数应该只做一件事情,并且做好。这样做可以提高函数的可复用性和可测试性。

// 错误示例:一个函数处理多个任务
function handleUserData(user) {
    if (user.age > 18) {
        // 验证年龄
    }
    if (user.name !== "") {
        // 检查名称
    }
    saveUser(user);
}

// 正确示例:函数分离责任
function isValidUser(user) {
    return user.age > 18 && user.name !== "";
}

function saveUser(user) {
    if (isValidUser(user)) {
        // 保存用户信息
    }
}

函数命名规范

函数名应该清晰地表明函数的功能。使用动词或动词短语来描述所执行的操作。

// 错误示例
function data(user) {
    // ...
}

// 正确示例
function createUser(user) {
    // 创建用户
}

参数长度

尽量减少函数的参数数量。过多的参数会使函数难以理解和使用。如果函数需要多个参数,考虑使用一个对象来传递参数。

// 错误示例
function createUser(name, email, password, age, gender) {
    // ...
}

// 正确示例
function createUser({ name, email, password, age, gender }) {
    // ...
}

默认参数

为函数参数提供默认值,这样可以使函数更容易使用,同时避免了在函数体内进行不必要的检查。

function createMessage(message, sender = 'System') {
    console.log(`${sender}: ${message}`);
}

createMessage('Hello World'); // 输出: System: Hello World

纯函数

尽可能编写纯函数,这些函数不会改变外部状态,也不依赖于它们。纯函数更容易测试和推理。

let count = 0;

// 错误示例
function increment() {
    count += 1;
}

// 正确示例
function increment(count) {
    return count + 1;
}

性能优化

优化JavaScript的性能是提高用户体验和减少资源消耗的关键。以下几个实用技巧和代码示例,帮助你高效地优化你的JavaScript代码。

减少DOM操作

缓存查询,对DOM元素进行查询后,将其存储在变量中以避免重复查询。

// 错误示例:频繁操作DOM
for (let i = 0; i < 100; i++) {
    document.getElementById('myElement').innerText = i;
}

// 正确示例:减少DOM操作
let myElement = document.getElementById('myElement');
for (let i = 0; i < 100; i++) {
    myElement.innerText = i;
}

提升JavaScript代码质量

避免嵌套循环

嵌套循环会增加代码的复杂度,使其难以阅读和维护。我们可以通过将内部循环提取为一个单独的函数来优化代码。
优化前:

for (let i = 0; i < array1.length; i++) {
  for (let j = 0; j < array2.length; j++) {
    // 一些复杂的逻辑
  }
}

优化后:

function processInnerLoop(item) {
  for (let j = 0; j < array2.length; j++) {
    // 一些复杂的逻辑
  }
}

for (let i = 0; i < array1.length; i++) {
  processInnerLoop(array1[i]);
}

使用map、filter和reduce替代for循环

在处理数组时,我们经常使用for循环来迭代数组并进行一些操作。然而,使用map、filter和reduce这些高阶函数可以使代码更加简洁和易于理解。
优化前:

let result = [];
for (let i = 0; i < array.length; i++) {
  if (array[i] > 10) {
    result.push(array[i] * 2);
  }
}

优化后:

let result = array.filter(item => item > 10).map(item => item * 2);

使用解构赋值简化代码

解构赋值是ES6中引入的一个新特性,它允许我们用更简洁的语法从数组或对象中提取数据。

优化前:

let firstName = person.firstName;
let lastName = person.lastName;
let age = person.age;

优化后:

let { firstName, lastName, age } = person;

多条件if判断

避免重复性的判断某一个变量,可将多个值放在一个数组中,然后调用数组的include方法。

优化前:

if (a === 'a' || a === 'b' || a === 'c' || a === 'd') {
  // 逻辑处理
}

优化后:

if (['a', 'b', 'c', 'd'].includes(a)) { 
  // 逻辑处理
}

使用默认参数值

在函数中,我们经常需要处理未传递的参数。使用默认参数值可以简化这个过程。

优化前:

function greet(name) {
  name = name || 'Guest';
  console.log('Hello, ' + name);
}

优化后:

function greet(name = 'Guest') {
  console.log(`Hello, ${name}`);
}

简化 if true else 条件表达式

逻辑只是true/false的赋值时,简化不必要的if语句。

优化前:

if (a > 100) {  
  bool = true;
} else {  
  bool = false;
}

优化后:

bool = a > 10;

indexOf的更简单写法

在数组中查找某个值是否存在可以使用indexOf方法,下面这种写法更简单。

优化前:

if (list.indexOf(item) > -1) {  
  // 存在
}

if (list.indexOf(item) === -1) {  
  // 不存在
}

优化后:

if (~list.indexOf(item)) {  
  // 存在
}

if (!~list.indexOf(item)) {  
  // 不存在
}

switch语句简化

将需要执行的条件存储在键值对象中,最后根据条件调用存储的方法。

优化前:

switch (type) {  
  case 1:    
    run1();    
    break;  
  case 2:    
    run2();    
    break;  
  case 3:    
    run3();    
    break;
}

优化后:

const data = {  
  1: run1,  
  2: run2,  
  3: run3,
};

data[type] && data[type]();

提前return

快速return(也称为提前return或守卫子句)是一种编程模式,特别是在处理多个条件判断时,它可以提高函数的可读性和性能。这种模式通过在函数的开始处检查条件,并在条件满足时立即返回,从而避免执行后续的不必要代码。

优化前:

function check(number) {
  if (number < 0) {
    return "Negative";
  } else if (number === 0) {
    return "Zero";
  } else {
    return "Positive";
  }
}

优化后:

function check(number) {
  if (number < 0) {
    return "Negative";
  }

  if (number === 0) {
    return "Zero";
  }

  return "Positive";
}

可选链运算符?.

可选链运算符?.提供了一种简洁的方式来安全地访问对象中深层嵌套的属性。它允许开发者在不进行每一步引用校验的情况下读取属性值,如果链中的任何引用是null或undefined,表达式将返回undefined。

const vacationItinerary = {        
    wednesday: {            
        venue: "Louvre Museum",            
        expenses: 150,        
    },    
};

使用传统方法来安全地访问一个可能不存在的属性会涉及多个逻辑与操作:

优化前:

const result = vacationItinerary && vacationItinerary.wednesday && vacationItinerary.wednesday.expenses; 

优化后:

const result = vacationItinerary?.wednesday?.expenses;   

多条件&&运算符

当你需要在变量为真时才执行某个函数,可以使用逻辑与&&运算符来简化代码。

优化前:

// 传统的条件判断
if (isValid) {  
  initiateProcess();
}

优化后:

// 简化后的条件执行
isValid && initiateProcess();

使用数字分隔符增强可读性

为了提升大数字的可读性,可以使用下划线_作为数值分隔符,它允许将数字分隔成更易于阅读的形式。

const number = 1_000_000_000;

console.log(number); // 输出:1000000000

字符串转换数字

虽然可以使用parseInt和parseFloat等内置方法将字符串转换为数字,但还有一种更简洁的方式:在字符串前使用一元加号+运算符。

优化前:

let total = parseInt("456");
let average = parseFloat("87.5");
优化后:

let total = +"456";
let average = +"87.5";

if (+currentState === 0) {
  // 执行相关操作
}

使用一元加号+进行转换是一种简单且有效的方法,尤其适合在需要轻量级转换的场景中。

提升控制台输出的清晰度

当你需要在控制台中打印变量的值时,将其包裹在对象字面量中可以同时显示变量名和值,从而提高输出的清晰度。

const username = "Peter";
console.log({ username });

// 控制台输出将会是:
{
   "username": "Peter"
}

这种方法不仅让你一目了然地看到变量的名称和对应的值,而且在调试多个变量时尤其有用。它避免了在控制台中查找与变量值对应的变量名的麻烦,使得调试过程更加高效。

数组截断技巧

要快速截断数组至指定长度,只需修改数组的length属性即可。

let numbers = ['1', '2', '3', '4'];
numbers.length = 2;
console.log(numbers); // 输出:['1', '2']

这个方法简单而直接,能够有效地减少数组的长度,而无需使用额外的函数或方法,尤其在你确切知道需要的数组长度时。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

网工学习云计算HCIE感受如何?

作为一名网工&#xff0c;我经常会在各种网络论坛里查询搜索一些网络技术资料&#xff0c;以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障&#xff0c;因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号&#xff0c;自从关注了誉天的…

真实世界的密码学(一)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 当你拿起这本书时&#xff0c;你可能会想&#xff0c;为什么又一本关于密码学的书&#xff1f;甚至&#xff0c;为什么我要读这本…

【DDD领域驱动设计】战术设计--核心概念介绍

目录 前言 战术设计 基本概念 领域内&#xff1a; 实体 值对象 领域服务 模块 对象生命周期&#xff1a; 聚合 工厂 仓库 其他&#xff1a; 领域事件 事件溯源 实例介绍 前言 上一篇文章 DDD-事件风暴 属于领域驱动设计中的战略设计&#xff0c;战略设计主要从…

数据中台工具的选型要点_光点科技

数据中台工具扮演着举足轻重的角色。想要全面理解数据中台工具的意义、作用以及应用方式&#xff0c;就必须深入探讨这一概念以及相关实践。 数据中台工具概述 数据中台&#xff0c;是一个支持数据集成、管理、分析和服务的平台&#xff0c;它能够帮助企业统一数据资源&#xf…

GreatSQL统计信息相关知识点

相关知识点&#xff1a; INNODB_STATS_PERSISTON或用STATS_PERSIST1定义单个表时&#xff0c;优化器统计信息将持久化到磁盘。默认情况下&#xff0c;innodb_stats_persistent是启用的。 持久统计信息存储在mysql.innodb_table_stats和mysql.innodb_index_stats表中。 默认情…

梦境绘师:揭秘生成对抗网络(GAN)的魔法

梦境绘师&#xff1a;揭秘生成对抗网络&#xff08;GAN&#xff09;的魔法 1 引言 在今日的深度学习领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;已成为一项无人能外的技术&#xff0c;以其独特的数据生成能力俘获了无数研究者和工程师的心。这项技术不仅在理论上…

CSS3新增特性(二)

四、2D 转换 • 属性名&#xff1a;transform &#xff08;可用于制作2D转换&#xff0c;也可用于制作3D转转换&#xff1b;2D转换是平面上的转换&#xff0c;3D转换是在三维立体空间的转换&#xff09; • 作用&#xff1a;对元素进行水平或垂直方向的移动、缩放、旋转、拉长…

【GitHub】2FA认证(双重身份验证)

GitHub 2FA认证&#xff08;双重身份验证&#xff09; 写在最前面一、使用 TOTP 应用程序配置双2FA&#xff08;双因素身份验证&#xff09;1. 介绍2. github3. 认证 官网介绍小结 & 补充 &#xff1a;权限不足or验证码错误问题 &#x1f308;你好呀&#xff01;我是 是Yu欸…

增加PyQt5界面的交通流量预测(模型为CNN_GRU,CNN_BiGRU_ATTENTION,LSTM,Python代码)

1.效果视频&#xff1a;增加PyQt5界面的交通流量预测&#xff08;模型为CNN_GRU&#xff0c;CNN_BiGRU_ATTENTION&#xff0c;LSTM&#xff09;_哔哩哔哩_bilibili&#xff09; 2.三个模型和数据集的介绍 交通流量预测(python代码&#xff0c;压缩包中带有数据&#xff0c;CN…

又发现一个超好用的youtube字幕翻译插件!!!

最近有了梯子&#xff0c;所以热衷于去youtube、Facebook、Twitter等网站浏览。但英语不好是硬伤&#xff0c;不懈努力之下&#xff0c;让我发现了一个超超超超好用的翻译插件——Relingo。 1.支持Youtube字幕翻译 官网下载安装后&#xff0c;打开youtube视频&#xff0c;右侧…

PVE虚拟机隐藏状态栏虚拟设备

虚拟机启动后&#xff0c;状态栏会出现一些虚拟设备&#xff0c;点击弹出会导致虚拟机无法使用。 解决方案&#xff1a; 1、在桌面新建disable_virtio_removale.bat文件&#xff0c;内容如下&#xff1a; ECHO OFF FOR /f %%A IN (reg query "HKLM\SYSTEM\CurrentContro…

【机器学习与实现】机器学习概述

目录 一、机器学习的基本概念和方法&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;机器学习的一般过程举例&#xff08;三&#xff09;样本和参数估计 二、机器学习的步骤总结&#xff08;一&#xff09;机器学习的主要步骤&#xff08;二&#xff09;样本及样…

MyBatis基础操作

黑马程序员JavaWeb开发教程 文章目录 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求&#xff0c;完成员工管理的需求开发一、环境准备1、准备数据库表emp2、创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动&#xff0c;传参有哪些方式&#xff1f; 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住&#xff1a;一般是对于Spring Boot应用特有的配置参数&#xff0c;确保它们遵循Spring Boot的配置属性命…

PC端微信软件如何多开【详细教程】

现在工作中&#xff0c;很多小伙伴会用到两个微信。如何在PC端同时登录多个微信呢&#xff1f;赶快跟着下面的教程学起来吧 1、创建一个txt文本文件 2、输入以下代码并保存 echo offstart "" "复制粘贴微信的目标地址" 需要开几个微信就复制几行exit示例…

顺序表leetcode刷题(C语言版)

一.移除元素 对于本题&#xff0c;共有两种解法&#xff1a; 思路一&#xff1a;创建新的数组&#xff0c;遍历原数组&#xff0c;将不为value的值放到新数组中&#xff0c;但本题不允许使用新的数组&#xff0c;因此该方法不行 思路二&#xff1a;使用快慢指针&#xff0c;原数…

2.5G交换机 TL-SE2109简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK&#xff08;普联&#xff09;的万兆上联的2.5G网管交换机TL-SE2109简单开箱测评。8个2.5电口&#xff0c;1个万兆SFP口。 TL-SH5428 万兆交换机开箱和简单的评测&#xff1a;https://blog.zeruns.tech/archives/707.html WiFi7无线路由器TL-7DR6560简单开箱测评&#x…

震惊!小红书矩阵账号管理-批量发布笔记

“小红书引流软件矩阵工具-笔记批量发” 昨天&#xff0c;有个粉丝急匆匆地来找我&#xff0c;一脸焦急地说&#xff1a;“大佬&#xff0c;我现在运营着好几个小红书账号&#xff0c;每天都要发布内容&#xff0c;可把我忙坏了&#xff0c;有没有什么高效的管理方法啊&#xf…

开源协议的对比和商业上的安全使用

开源协议的对比和商业上的安全使用 开源组件是&#xff1a;“任何人都可以自由使用、更改和共享&#xff08;以修改或未修改的形式&#xff09;的软件”。当今企业依靠开源来加速开发、降低成本和推动创新。对开放源码的糟糕管理可能会使组织面临安全、法律和操作风险。 使用…
最新文章