前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript重构技巧-让函数简单明了

JavaScript重构技巧-让函数简单明了

作者头像
前端小智@大迁世界
发布于 2020-05-28 14:31:27
发布于 2020-05-28 14:31:27
1.1K00
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:0
代码可运行

JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的程序很容易。然而,要编写一段干净的JavaScript 代码是很困难的。

在本文中,我们将研究如何让我们的函数更清晰明了。

对对象参数使用解构

如果我们希望函数接收很多参数,那么应该使用对象。在此基础上,我们就可以使用解构语法提取我们需要的参数。

例如,对于对象参数,我们可能会这样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const greet = (obj) => {
  return `${obj.greeting}, ${obj.firstName}${obj.lastName}`;
}

上面的语法,我们可以使用解构方式会更优雅:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const greet = ({
  greeting,
  firstName,
  lastName
}) => {
  return `${greeting}, ${firstName}${lastName}`;
}

这样我们可以少写很多重复的东西,命名也会更加清晰。

命名回调函数

好的命名会使阅读代码更容易,回调函数的命名也是一样的,例如下面不好的命名方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const arr = [1, 2, 3].map(a => a * 2);

我们可以这样分开命名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const double = a => a * 2;
const arr = [1, 2, 3].map(double);

现在我们知道我们的回调函数实际上是用来加倍原始数组的每个元素的。

让条件句具有描述性

通过在自己的函数的条件语句中编写条件表达式,可以使条件语句更具描述性。

对于复杂的条件判断, 我们可以单独使用函数来表示,会让条件语句更具描述性,例如下面代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (score === 100 ||
  remainingPlayers === 1 ||
  remainingPlayers === 0) {
  quitGame();
}

当条件多时,我们可以用函数来表示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const winnerExists = () => {
  return score === 100 ||
    remainingPlayers === 1 ||
    remainingPlayers === 0
}
if (winnerExists()) {
  quitGame();
}

这样,我们就知道这些条件是检查游戏代码中是否存在赢家的条件。

在第一个例子中,我们有一个很长的表达式在括号里,大多数人可能不知道它在判断什么。但在第二个例子中,一旦我们把它放到一个命名函数中,我们就知道它大概在判断什么了。

在条件语句中拥有一个命名函数比在拥有一堆布尔表达式要清晰得多。

用 Map 或 Object替换 switch 语句

由于 switch语句很长,这样容易出错。 因此,如果可以的话,我们应该用较短的代码代替它们。许多switch语句可以用mapobject替换。例如,如果我们有下面的switch语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const getValue = (prop) => {
  switch (prop) {
    case 'a': {
      return 1;
    }
    case 'b': {
      return 2;
    }
    case 'c': {
      return 3;
    }
  }
}
const val = getValue('a');

我们可以将其替换为objectmap,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {
  a: 1,
  b: 2,
  c: 3
}
const val = obj['a'];

如我们所见,switch 语法很长。 我们需要嵌套多个带有多个return语句的块,只是为了获得给定prop值的返回值。

相反使用对象,我们仅仅需要一个对象就可以了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {
  a: 1,
  b: 2,
  c: 3
}

使用对象还有一个好处,就是对于键不必是有效的标识符号,这样这增加了更多的灵活性。

我们还可以使用map替换对象,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const map = new Map([['a', 1], ['b', 2], ['c', 3]])
const val = map.get('a')

如我们所见,使用Map时,代码也短很多。 我们通过传递一个数组,数组中的每项包含键和值。然后,我们仅使用Map实例的get方法从键中获取值。

Map优于对象的一个​​好处是,我们可以将数字,布尔值或对象等其他值用作键。 而对象只能将字符串或symbol作为键。

总结

使用解构语法可以使对象参数更清楚,更短。 这样,可以选择性地将属性作为变量进行访问。

通过将条件表达式放在它自己的命名函数中,可以使条件表达式更具描述性。同样,我们应该为回调函数命名,以便更容易地读取代码。

最后,应该尽可能用MapObject替换switch语句。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
scrapy爬虫标准流程
一般我们一个小的爬虫项目,比如爬取一些文章等,直接用python的requests库,配合re模块就可以很快的完成。但是对于一些大规模的爬取,我们需要实现多线程、异步io,数据库连接等操作,自己从头写起会有些麻烦。这时可以用scrapy这个爬虫框架。
羽翰尘
2019/11/20
6490
python爬虫入门(八)Scrapy框架之CrawlSpider类
CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpider是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。 CrawSpider源码详细解析 class CrawlSpider(Spider)
zhang_derek
2018/04/11
2.3K0
python爬虫入门(八)Scrapy框架之CrawlSpider类
Scrapy入门案例——腾讯招聘(CrawlSpider升级)
需求和上次一样,只是职位信息和详情内容分开保存到不同的文件,并且获取下一页和详情页的链接方式有改动。
100000860378
2018/09/13
7920
Scrapy入门案例——腾讯招聘(CrawlSpider升级)
Python之CrawlSpider
CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的
鱼找水需要时间
2023/02/16
4010
Python之CrawlSpider
Python:阳光热线问政平台爬虫
爬取投诉帖子的编号、帖子的url、帖子的标题,和帖子里的内容。 items.py import scrapy class DongguanItem(scrapy.Item): # 每个帖子的标题 title = scrapy.Field() # 每个帖子的编号 number = scrapy.Field() # 每个帖子的文字内容 content = scrapy.Field() # 每个帖子的url url = scrapy.Field()
Lansonli
2021/10/09
4140
Scrapy框架中crawlSpider的使用——爬取内容写进MySQL和拉勾网案例
Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。该案例采用的是CrawlSpider类实现爬虫进行全站抓取。
菲宇
2019/06/13
1.3K0
Python爬虫之分布式爬虫
搭建分布式机群,让其对一组资源进行分布式联合爬取 提升爬取效率 实现分布式: pip install scrapy-redis scrapy-redis 组件的作用: 给原生的scrapy框架提供可以被共享的管道和调度器 ---- 分布式爬虫 实现步骤: scrapy startproject firstdemo scrapy genspider -t crawl xxx [www.xxx.com](http://www.xxx.com/) 修改当前爬虫文件 导包 : from scrapy_r
shaoshaossm
2022/12/26
4831
Python网络爬虫(七)- 深度爬虫CrawlSpider1.深度爬虫CrawlSpider2.链接提取:LinkExtractor3.爬取规则:rules4.如何在pycharm中直接运行爬虫5.
目录: Python网络爬虫(一)- 入门基础 Python网络爬虫(二)- urllib爬虫案例 Python网络爬虫(三)- 爬虫进阶 Python网络爬虫(四)- XPath Python网络爬虫(五)- Requests和Beautiful Soup Python网络爬虫(六)- Scrapy框架 Python网络爬虫(七)- 深度爬虫CrawlSpider Python网络爬虫(八) - 利用有道词典实现一个简单翻译程序 深度爬虫之前推荐一个简单实用的库fake-useragent,可以伪装
Python攻城狮
2018/08/23
1.9K0
Python网络爬虫(七)- 深度爬虫CrawlSpider1.深度爬虫CrawlSpider2.链接提取:LinkExtractor3.爬取规则:rules4.如何在pycharm中直接运行爬虫5.
外行学 Python 爬虫 第十篇 爬虫框架Scrapy
前面几个章节利用 python 的基础库实现网络数据的获取、解构以及存储,同时也完成了简单的数据读取操作。在这个过程中使用了其他人完成的功能库来加快我们的爬虫实现过程,对于爬虫也有相应的 python 框架供我们使用「不重复造轮子是程序员的一大特点」,当我们了解爬虫的实现过程以后就可以尝试使用框架来完成自己的爬虫,加快开发速度。
keinYe
2019/08/15
1.2K0
爬虫课堂(二十五)|使用CrawlSpider、LinkExtractors、Rule进行全站爬取
在爬虫课堂(二十二)|使用LinkExtractor提取链接中讲解了LinkExtractor的使用,本章节来讲解使用CrawlSpider+LinkExtractor+Rule进行全站爬取。 一、CrawlSpider介绍 Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。Spider类的使用已经讲解了很多,但是如果想爬取某个网站的全站信息的话,CrawlSpider类是个非常不错的选择。CrawlSpider继承于Spider类,CrawlSpider是爬取那些具有一定规则网站
黄小怪
2018/05/21
1.4K0
Scrapy框架-Spider和Craw
目录 1.目标 2.方法1:通过Spider爬取 3. 通过CrawlSpider爬取 1.目标 http://wz.sun0769.com/index.php/question/questionTy
py3study
2020/01/17
3860
Python爬虫项目--爬取链家热门城市
本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途)
py3study
2020/01/20
7790
Scrapy爬虫,华为商城商品数据爬虫demo
来自于华为云开发者大会,使用Python爬虫抓取图片和文字实验,应用Scrapy框架进行数据抓取,保存应用了mysql数据库,实验采用的是线上服务器,而这里照抄全是本地进行,如有不同,那肯定是本渣渣瞎改了!
二爷
2020/11/25
8060
Scrapy爬虫,华为商城商品数据爬虫demo
安装和使用Scrapy
可以先创建虚拟环境并在虚拟环境下使用pip安装scrapy。 $ 项目的目录结构如下图所示。 (venv) $ tree . |____ scrapy.cfg |____ douban | |____ spiders | | |____ __init__.py | | |____ __pycache__ | |____ __init__.py | |____ __pycache__ | |____ middlewares.py | |____ settings.py | |____ items.py |
用户8442333
2021/05/21
5060
Scrapy Crawlspider的详解与项目实战
回顾上一篇文章,我们大多时间都是在寻找下一页的url地址或者是内容的url地址上面,我们的大体思路是这样的:
咸鱼学Python
2019/10/09
2K0
Python网络爬虫(六)- Scrapy框架1.Scrapy2.安装和配置3.安装过程常见错误4.代码操作 - 创建一个Scrapy项目5.Scrapy框架进阶 - 深度爬虫
Scrapy Engine(Scrapy核心) 负责数据流在各个组件之间的流。Spiders(爬虫)发出Requests请求,经由Scrapy Engine(Scrapy核心) 交给Scheduler(调度器),Downloader(下载器)Scheduler(调度器) 获得Requests请求,然后根据Requests请求,从网络下载数据。Downloader(下载器)的Responses响应再传递给Spiders进行分析。根据需求提取出Items,交给Item Pipeline进行下载。Spiders和Item Pipeline是需要用户根据响应的需求进行编写的。除此之外,还有两个中间件,Downloaders Mddlewares和Spider Middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展Scrapy的功能,例如去重等。
Python攻城狮
2018/08/23
1.8K0
Python网络爬虫(六)- Scrapy框架1.Scrapy2.安装和配置3.安装过程常见错误4.代码操作 - 创建一个Scrapy项目5.Scrapy框架进阶 - 深度爬虫
Python爬虫之crawlspider类的使用
对应的crawlspider就可以实现上述需求,能够匹配满足条件的url地址,组装成Reuqest对象后自动发送给引擎,同时能够指定callback函数
海仔
2020/09/28
7170
爬虫系列(13)Scrapy 框架-CrawlSpider、图片管道以及下载中间件Middleware。
首先在说下Spider,它是所有爬虫的基类,而CrawSpiders就是Spider的派生类。对于设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。
野原测试开发
2019/07/10
1.4K0
普通爬虫有啥意思,我写了个通用Scrapy爬虫
除了钱,大家还比较喜欢什么?当然是全能、万能和通用的人或事物啦,例如:全能、什么都会的员工、万能钥匙、通用爬虫等等。今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来获取美食杰网站[1]。
Python进击者
2022/01/11
1.1K0
普通爬虫有啥意思,我写了个通用Scrapy爬虫
CrawlSpider(规则爬虫)和Spider版爬虫
1.规则爬虫--scrapy genspider -t crawl Question wz.sun0769.com
用户2337871
2019/07/19
6310
推荐阅读
相关推荐
scrapy爬虫标准流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档