前端代码规范 - 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.mzph.cn/diannao/2682.shtml

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

相关文章

什么因素可以影响到代理IP稳定性?爬虫代理IP有哪些作用?

一、什么因素可以影响到代理IP稳定性 代理IP的稳定性受到多种因素的影响&#xff0c;以下是一些主要的因素&#xff1a; 代理IP的质量&#xff1a;不同的代理IP提供商提供的代理IP质量参差不齐&#xff0c;一些低质量的代理IP可能经常出现连接问题或速度慢的情况&#xff0c;…

力扣HOT100 - 104. 二叉树的最大深度

解题思路&#xff1a; class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }

利用OpenCV4.9制作自己的线性滤波器!

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9使用 inRange 的阈值操作 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 f…

Element-plus使用记录

Element-plus使用中遇到的问题与解决方案 动态渲染icon Element-plus中的icon需要单独安装Icon 图标 | Element Plus <template><div class"page"><div class"h-menu"><div class"show-menu" click"isCollapseHandle&…

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取&#xff0c;requests的基本常用语法 import requests # 先向目标网站发送请求 url "http://www.baidu.com" r requests.get(url) # 可以用看一下访问码返回值是不是200&#xff0c;若是200则表示访问成功 print(r.status_…

RustGUI学习(iced)之小部件(一):如何使用按钮和文本标签部件

前言 本专栏是学习Rust的GUI库iced的合集&#xff0c;将介绍iced涉及的各个小部件分别介绍&#xff0c;最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个&#xff0c;目前处于发展中&#xff08;即版本可能会改变&#xff09;&#xff0c;本专栏基于版本0.12.1. 概述…

ZYNQ DMA环通测试

DMA(Direct Memory Access,直接内存存取),是指外部设 备不通过CPU直接与系统内存交换数据的接口技术。要将外设数据读入内存或将内存传送到外 设,一般都要通过CPU控制完成,如采用查询或中断方式。如前面讲到的BRAM实验。 虽然中断方式可以提高CPU的利用率,但是也会有效率…

前端CSS基础8(盒子模型(margin、border、padding、content))

前端CSS基础8&#xff08;盒子模型&#xff08;margin、border、padding、content&#xff09;&#xff09; CSS盒子模型CSS中常用的长度单位元素的分类&#xff0c;各个元素的显示模式修改元素的显示模式&#xff08;类型&#xff09;盒子模型的组成部分盒子内容区-contentCSS…

关于分布式锁的释放和spring事务提交时机不符合预期从而带来的数据不一致的问题

提要 首先注意&#xff0c;本文探讨的不是分布式事务&#xff0c;请读者注意区分&#xff01; 在我们的日常开发种&#xff0c;分布式锁和spring事务是常见的两种控制数据一致性的方式。 分布式锁和spring事务各自的作用就不做阐述了&#xff0c;不是本文重点&#xff0c;本文…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘.

问题1&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas. 解决方案&#xff1a; import matplotlib matplotlib.use(Agg) # 选择合适的后端&#xff0c;如Aggimport matplotlib.pyplot as plt在你的代码开头加上这两行代码&#xff0c;…

AIGC技术的发展现状与未来趋势

AIGC&#xff08;人工智能生成内容&#xff09;技术是近年来快速发展的领域之一&#xff0c;它涉及使用人工智能来创建或编辑内容&#xff0c;包括文本、图像、音乐和视频等。这项技术的进步为各个行业带来了革命性的变化&#xff0c;同时也引发了一系列伦理和风险问题。 一、技…

安卓一键换壁纸

360手机有一个很赞的应用&#xff0c;没有界面&#xff0c;点击一下图标换一张壁纸&#xff0c;其他手机都没有看到这个功能。 vivo倒是有亮屏换锁屏壁纸。 1.无界面应用 https://blog.51cto.com/u_16213305/8503774 AndroidManifest.xml 主题改为不显示 <activity an…

宜搜科技死磕港交所上市:从搜索引擎到广告投放,业绩疲态凸显

近日&#xff0c;宜搜科技控股有限公司&#xff08;下称“宜搜科技”&#xff09;向港交所递交招股书&#xff0c;计划在香港主板上市&#xff0c;中银国际为其独家保荐人。 值得注意的是&#xff0c;宜搜科技已在资本市场辗转多年。该公司曾于2014年向纽交所递交上市申请&…

CentOS7编译jsoncpp静态库

1. 官网下载源码 github地址&#xff1a;GitHub - open-source-parsers/jsoncpp at update 2. 编译 Unzip jsoncpp-master.zip Cd jsoncpp-master mkdir -p ./build/debug cd ./build/debug/ cmake -DCMAKE_BUILD_TYPEdebug -DBUILD_SHARED_LIBSOFF -DCMAKE_ARCHIVE_OUTPUT_D…

docker快速搭建部署mqtt

文章目录 前言一、mqtt是什么&#xff1f;二、使用步骤1.引入库2.创建临时容器3.创建挂在目录4.将临时容器的配置挂载到宿主机中5.删除临时容器6.运行容器并挂载文件7.登录EMQX内置的管理控制台 总结 前言 一、mqtt是什么&#xff1f; MQTT&#xff08;Message Queuing Teleme…

Ts类型体操详讲 之 extends infer (下)

目录 1、函数 &#xff08;1&#xff09;提取参数类型 &#xff08;2&#xff09;提取返回值类型 2、构造器 &#xff08;1&#xff09;提取构造器返回值 &#xff08;2&#xff09;提取构造器参数类型 3、索引类型 本章我们继续上节的内容继续&#xff0c;展示我们对ex…

送变电乙级资质从入门到成功申请

1. 初步了解与规划 研究资质标准&#xff1a;首先&#xff0c;详细研究最新的送变电乙级资质标准&#xff0c;包括企业资质条件、人员配置要求、技术设备标准等。企业准备&#xff1a;确保企业具备独立法人资格&#xff0c;注册资本达标&#xff0c;且企业信誉良好。制定计划&…

C++ //练习 13.24 如果本节中的HasPtr版本未定义析构函数,将会发生什么?如果未定义拷贝构造函数,将会发生什么?

C Primer&#xff08;第5版&#xff09; 练习 13.24 练习 13.24 如果本节中的HasPtr版本未定义析构函数&#xff0c;将会发生什么&#xff1f;如果未定义拷贝构造函数&#xff0c;将会发生什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工…

华为OD机试真题-田忌赛马-2024年OD统一考试(C卷D卷)

题目描述: 给定两个只包含数字的数组a,b,调整数组 a 里面数字的顺序,使得尽可能多的 a[i] >b[i]。数组 a和 b 中的数字各不相同。 输出所有可以达到最优结果的 a 数组的数量 输入描述: 输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具&#xff0c;能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术&#xff0c;提升爬虫的匿名性和效率&#xff0c;以适应Kwai视频平台的发展趋势。 正…