给前端小白的11个建议(少走弯路)

作为一个编程4年的的前端工程师,一路走来踩过许多坑。希望我的经验能让你少踩些坑,在编程的路上走的更顺些!

1. 禁用var声明

只使用const或let声明变量。并且首选const,当一个变量需要重新赋值时,才使用let。并且在创建变量时就应该给变量赋值

原因:

  • var缺乏作用域的限制,很容易导致全局作用域污染,引发“命名冲突”和“错误赋值”等问题。

  • var存在变量提升,可能导致在变量声明之前就使用变量,产生未定义的情况。

  • var允许重复声明同一变量,容易导致意外修改已有变量的值,引发代码错误。

注意:我们最好在创建变量时就进行赋值,这样可以防止我们的代码出现,声明了变量但未赋值的情况。

代码示例:

// ❌ 错误做法
var old = "";// ✅ 正确做法
const immutable = "John";
let counter = 1;
counter++; // counter === 2;// 将对象和数组声明为const,以防止类型更改
const user = {firstname: "John", lastname: "Doe"};
const users = ["Mac", "Roe"];

2.使用严格相等运算符(===)

在进行相等比较时,只使用严格相等运算符(===)进行比较。

原因:

  • 双等号(==)在进行类型比较时会默认进行类型转换,导致不同类型的值也可能被判定为相等。

  • 严格相等运算符(===)不仅比较两个值的值,还会比较它们的数据类型。只有值和类型都相同时才会返回 true。

注意:在使用双等号进行0作为假值会错误地等于false,

代码示例:

// ❌ 错误做法
1 == "1"; // true
0 == false; // true
"" == 0; // true
null == undefined; // true
[1] == true; // true
"false" == false; // false// ✅ 正确做法
1 === 1; // true
1 === "1"; // false
0 === false; // false

3.使用模板字符串来拼接内容

使用模板字符串(反引号标记)来拼接字符串,而不是使用加号(+)。

原因:

  • 模板字符串允许在字符串中插入变量或表达式,使得代码更加清晰易读。

代码示例:

const name = 'Alice';
const age = 30;// ❌ 错误做法
// 字符串拼接 
const greeting = 'Hello, my name is ' + name + ' and I am ' + age + ' years old.'; console.log(greeting); // Hello, my name is Alice and I am 30 years old. // 多行字符串(使用\n换行) 
const multiLineString = 'This is a\nmulti-line\nstring.'; console.log(multiLineString); // This is a // multi-line // string.// ✅ 正确做法
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;console.log(greeting); // Hello, my name is Alice and I am 30 years old. // 多行字符串 
const multiLineString = ` This is amulti-line string. `;
console.log(multiLineString); 
//This is a 
// multi-line 
// string.

4.在语句末尾使用分号

在行末使用分号结尾是一种很好的习惯,虽然不使用分号,编译器也不会进行报错,但在我们项目越来越庞大代码越来越复杂时,分号可以帮助我们更好的理解代码。维护起来也会更加轻松。

以for循环为例:

代码示例:

// ❌ 错误做法
for (let i = 0 i < numbers.length i++) {console.log(numbers[i]);
} // 报错:Uncaught SyntaxError: Unexpected identifier// ✅ 正确做法
for (let i = 0; i < numbers.length; i++) {console.log(numbers[i]);
}

在上面的示例中,缺少分号会导致编译器认为它是一个表达式,但是它实际上是三个独立不同的表达式,这样的结果就是会引起报错。

5. 使用对象代替多个参数

在定义函数时,给函数定义多个参数的做法是很愚蠢的一种写法,因为,当需要传的参数变的很多很复杂时,代码的阅读和维护就变的很困难,而使用对象参数是一种很好的替代方案。

代码示例:


// ❌ 错误做法
function avatarUrl(avatar, format = "small", caption = true,) {//函数内容
}avatarUrl(user.avatar, 'thumb', false)

当我们在使用上面这个函数时,很难知道哪些参数被使用了以及他的含义是什么。例如上面avatarUrl的最后一个参数false,就很难让人理解它代表的是什么意思呢?

所以我们在维护时,必须要阅读完函数的定义才能知道他的每个参数代表什么意思。而且当我们需要改变参数的顺序时,不得不改变所有地方的函数调用。

但是如果我们使用对象来传参,一个顺序的改变并不会影响到所有地方的调用:

// ✅ 正确做法
function avatarUrl(avatar, options={format: 'small', caption: true}) {// 函数内容
}avatarUrl(user.avatar, {
caption: false , 
format: "thumb"
})

6. 利用提前返回简化逻辑

在编写代码时,我们经常会用到if/else来进行判断,而且可能会进行多层嵌套,但是过多过深的嵌套会使的我们的代码可读性变差并且很难维护,所以我们使用return来解决这个问题。

提前返回可以减少大量的不必要的else条件,提高代码的可读性

代码示例:

// ❌ 错误做法
function doSomething() {if (user) {if (user.role === "ADMIN") {return 'Administrator';} else {return 'User';}} else {return 'Anonymous';}
}// ✅ 正确做法
function doSomething() {if (!user) return 'Anonymous'if (user.role === "ADMIN") return 'Administrator'return 'User'
}

7. 熟练掌握内置函数

JavaScript给我们提供了许多内置的Array、Object、String函数。我们需要精通并掌握它们,这样让我们写起代码时来事半功倍。

代码示例:

//我们要过滤掉admin属性值为false的对象// ❌ 错误做法
const users = [{username: "JohnDoe",admin: false},{username: "Todd",admin: true},
];
const admins = [];function getAdmins() {users.forEach((user) => {if (user.admin) admins.push(user)})return admins
}// ✅ 正确做法
function getAdmins() {return users.filter((user) => user.admin)
}

8.禁止使用缩写

当初学者在刚开始编写代码时,很容易为了贪图方便和快,就用缩写来进行命名,虽然这样是方便的当时的工作,但是却为后期的维护埋下了定时炸弹。让后续的代码阅读和维护变的难上加难。


// ❌ 错误做法
function someFunction() {events.forEach(e => {e.tickets.forEach(t => {`${e.name} for ${t.full_name}`})})
}// ✅ 正确做法
function someFunction() {events.forEach(event => {event.tickets.forEach(ticket => {`${event.name} for ${ticket.full_name}`})})
}

很明显的是,在下面的例子中我们在阅读和维护时都不用猜测参数e和t代表什么意思和作用,根据命名就可以知道它的作用和含义。极大的提高了代码的可读性和后期的维护。

9. 使用可选链操作符(?.)来代替&&的前置非空判断

在遇到对象的某个属性可能为空(null)或者不存在(undefined)时,我们都要提前对对象进行判空,很多人第一时间都会想到使用&&进行前置非空判断,但是其实遇到这种情况,我们使用可选链操作符(?.也能达到一样的效果,并且可读性更强。

示例1:


// ❌ 错误做法
function doSomething(params) {if (params && params.filter) return 'Foo'return 'Bar'
}// ✅ 正确做法
function doSomething(params) {if (params?.filter) return 'Foo'return 'Bar'
}

10. 用for...of代替for循环

传统的for循环需要我们手动创建索引变量并且需要根据条件判断来进行递增/递减操作,而for...of内置了一个迭代器可以自动帮我们遍历数组中的所有值,这样我们的代码可以变的更加简洁,也可以减少手动操作出差的情况。

let users = ["Fedor Emelianenko", "Cyril Gane", "Conor McGregor"];// ❌ 错误做法
// 这样可以避免在每次迭代时重新评估长度
let usersCount = users.length;
for (let i = 0; i < usersCount; i++) {console.log(users[i]);
}// ✅ 正确做法
for(let user of users) {console.log(user);
}

11. 可读性代码胜过聪明代码

  • 永远记住,我们写的代码是给其他开发人员以及未来的自己看的。我们编写的代码的目的是为了解决某个问题,而不是让我们的代码成为一个问题(bug)。

  • 不要为了炫技而写代码,我们要写出每个人都能理解和调试的代码。

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

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

相关文章

队列与循环队列

目录 1. 前言&#xff1a; 2. 队列 2.1 队列的概念 2.2 队列的实现 2.3 队列的声明 2.4 队列的初始化 2.5 队列的入队 2.6 队列的出队 2.7 队列获取队头元素 2.8 队列获取队尾元素 2.9 队列获取有效数据个数 2.10 队列判断是否为空 2.11 打印队列 2.12 销毁队列 …

大厂面试经验分享,小白如何在面试中脱颖而出

前言 毕业季&#xff0c;对于每一位即将步入社会的学子来说&#xff0c;都是一个充满挑战和机遇的时刻。作为我的一位好朋友也是好学长&#xff0c;他刚刚在一家顶尖科技公司斩获了他梦寐以求的职位。他深知求职路上的艰辛&#xff0c;因此打算把自己的经验分享给大家&#xf…

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

多业态、多品牌企业,如何实现积分通积通兑?(附大会员方案)

2021年&#xff0c;龙湖升级珑珠为全业态通用积分&#xff0c;招商荟深度接入招商蛇口大会员体系建设&#xff1b;2022年&#xff0c;华润置地大会员“万象星”正式上线&#xff1b;2023年&#xff0c;“蒙牛生活家会员中心”全新上线…… 越来越多地产、零售等行业的集团品牌…

【JavaScript】JS对象和JSON

目录 一、创建JS对象 方式一&#xff1a;new Object() 方式二&#xff1a;{属性名:属性值,...,..., 方法名:function(){ } } 二、JSON格式 JSON格式语法&#xff1a; JSON与Java对象互转: 三、JS常见对象 3.1数组对象API 3.2 其它对象API 一、创建JS对象 方式一&#xff1a;new…

初创企业合规管理中的企业合规义务边界问题

在初创企业的迅猛发展过程中&#xff0c;合规管理是确保公司可持续成长和避免潜在风险的关键因素。而在合规管理中&#xff0c;界定企业边界尤为重要&#xff0c;它关系到企业如何合理规划业务范围、管理内部外部关系以及维护企业形象和法律责任的清晰。 一、初创企业面临的合…

早餐店小程序开发

在快节奏的城市生活中&#xff0c;早餐对于许多人来说是一天中最重要的一餐。然而&#xff0c;传统的早餐店在经营过程中常常面临客流量不稳定、服务效率低下等问题。为了解决这些问题&#xff0c;越来越多的早餐店老板开始寻求利用科技手段提升经营效率。早餐店小程序作为一种…

英伟达连跌3日,传字节与博通合作研发AI芯片,讯飞星火V4.0周四发布

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 每日行业新闻 1、英伟达单日下跌6.7%&#xff0c;拖累标普500指数和纳指走低 昨夜&#xff0c;英伟达暴跌6.7%&#xff0c;创两个月以来最大单日跌幅&#xff0c;为连续三个交易日下跌&#xff0c;市…

web渗透-SSRF漏洞及discuz论坛网站测试

一、简介 ssrf(server-side request forgery:服务器端请求伪造&#xff09;是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;ssrf是要目标网站的内部系统。(因为他是从内部系统访问的&#xff0c;所有可以通过它攻击外网无法访问的内部系统&…

AttributeError: module ‘numpy‘ has no attribute ‘long‘

我使用的numpy版本是1.26.4。numpy.long在numpy 1.20就不维护了&#xff0c;numpy 1.24就移除掉了&#xff0c;因此解决方案之一就是重新安装numpy 或者&#xff0c;ctrl鼠标左键定位到报错的地方&#xff0c;将numpy.long改为numpy.longlong。 https://numpy.org/devdocs/rele…

【JavaScript】DOM编程

目录 一、什么是DOM编程 二、获取DOM树上的元素结点 1.直接获取 2.间接获取 三、操作获取到的DOM元素结点 1.操作元素的属性 2.操作元素的行内样式 3.操作元素中间的文本 四、增删DOM元素结点 一、什么是DOM编程 开发人员写好的网页文件在生产环境中是需要部署在Web服务器上的。…

华为OD机试 - 掌握单词个数(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

旧衣回收小程序开发:回收市场的新机遇

当下&#xff0c;旧衣服回收已经成为了一种流行趋势&#xff0c;居民都将闲置的衣物进行回收&#xff0c;旧衣回收市场规模在不断增加。随着市场规模的扩大&#xff0c;为了让居民更加便利地进行回收&#xff0c;线上回收小程序也应运而生&#xff0c;为大众打造了一个线上回收…

tldraw白板组件

tldraw 是一个开源的白板组件&#xff0c;10行代码就可以将其接入到 React 项目中&#xff1a; import { Tldraw } from tldraw import tldraw/tldraw.cssexport default function App() {return (<div style{{ position: fixed, inset: 0 }}><Tldraw /></div&…

u盘插到另一台电脑上数据丢失怎么办?提供实用的解决方案

在现代数字化生活中&#xff0c;U盘作为一种便携式存储设备&#xff0c;承载着我们重要的数据和信息。然而&#xff0c;有时当我们将U盘插入另一台电脑时&#xff0c;可能会遇到数据丢失的棘手问题。这可能是由于多种原因造成的&#xff0c;那么&#xff0c;U盘插到另一台电脑上…

虚拟化技术(一)

目录 一、虚拟化技术简介二、服务器虚拟化&#xff08;一&#xff09;服务器虚拟化的层次&#xff08;二&#xff09;服务器虚拟化的底层实现&#xff08;三&#xff09;虚拟机迁移&#xff08;四&#xff09;隔离技术&#xff08;五&#xff09;案例分析 一、虚拟化技术简介 虚…

ubuntu中共享文件夹看不到了,解决方法

1、检查共享文件夹配置 2、创建 3、查看共享文件夹 4、另一问题&#xff0c;每次重启虚拟机后&#xff0c;共享文件夹又没了&#xff1f;

Git->git pull 和 git pull --rebase的详解

Git拉取代码的坑 格式&#xff1a;git xx指令 origin/远程仓库分支名称假如本地仓库和远程仓库都是空的 本地仓库向远程仓库提交一个文件 git commit -a -m "local first commit"&#xff1a;-a暂存修改文件到暂存区&#xff0c;准备本地提交。-m表示提交信息git pu…

常微分方程算法之编程示例五(阿当姆斯法)

目录 一、研究问题 二、C代码 三、计算结果 一、研究问题 本节我们采用阿当姆斯法&#xff08;Adams法&#xff09;求解算例。 阿当姆斯法的原理及推导请参考&#xff1a; 常微分方程算法之阿当姆斯法&#xff08;Adams法&#xff09;_四步四阶adams显格式;三步四阶adams隐…

10.二次开发——黑马程序员Java最新AI+若依框架项目

目录 前言零、使用若依修改器修改项目名称一、创建sky-merchant模块1.创建模块2. 在新模块中导入依赖3. 父工程锁定版本4. sky-admin 导入依赖 二、菜品管理页面生成1.根据页面原型&#xff0c;确定表信息2.设计表3使用代码生成器生成页面4&#xff0c;下载tb_dish代码并分别导…