51CTO首页
AI.x社区
博客
学堂
精品班
免费课
企业培训
鸿蒙开发者社区
WOT技术大会
AIGC创新中国行
IT证书
公众号矩阵
移动端

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧

开发 前端
和许多其他语言一样,JavaScript 也需要靠很多小技巧去完成各种不同的事情。有的可能早已经广为人知,有的却可能会让你感到有些迷惑。接下来先介绍27个马上就能用起来的 JavaScript 小技巧,下面和小编一起来看看吧!
和许多其他语言一样,JavaScript 也需要靠很多小技巧去完成各种不同的事情。有的可能早已经广为人知,有的却可能会让你感到有些迷惑。接下来先介绍27个马上就能用起来的 JavaScript 小技巧,下面和小编一起来看看吧!

1.判断数据类型

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用 Object.prototype.toString 配合闭包,在保证判断数据类型的准确性时,同时能让这个函数非常灵活,通过传入不同的判断类型来返回不同的判断函数(注意传入 type 参数时首字母大写)。

2. ES5 实现数组 map 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

值得一提的是,map 的第二个参数为第一个参数回调中的 this 指向,如果第一个参数为箭头函数,那设置第二个 this 会因为箭头函数的词法绑定而失效。

3. 使用 reduce 实现数组 map 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

4. ES5 实现数组 filter 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

5. 使用 reduce 实现数组 filter 方法

 

6. ES5 实现数组的 some 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

执行 some 方法的数组如果是一个空数组,最终始终会返回 false,而另一个数组的 every 方法中的数组如果是一个空数组,会始终返回 true。

7. ES5 实现数组的 reduce 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

8. 使用 reduce 实现数组的 flat 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

因为 selfFlat 是依赖 this 指向的,所以在 reduce 遍历时需要指定 selfFlat 的 this 指向,否则会默认指向 window 从而发生错误。

原理通过 reduce 遍历数组,遇到数组的某个元素仍是数组时,通过 ES6 的扩展运算符对其进行降维(ES5 可以使用 concat 方法),而这个数组元素可能内部还嵌套数组,所以需要递归调用 selfFlat。

同时原生的 flat 方法支持一个 depth 参数表示降维的深度,默认为 1 即给数组降一层维度。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

传入 Inifity 会将传入的数组变成一个一维数组。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

原理是每递归一次将 depth 参数减 1,如果 depth 参数为 0 时,直接返回原数组。

9.实现 ES6 的 class 语法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

ES6 的 class 内部是基于寄生组合式继承,它是目前最理想的继承方式,通过 Object.create 方法创造一个空对象,并将这个空对象继承 Object.create 方法的参数,再让子类(subType)的原型对象等于这个空对象,就可以实现子类实例的原型等于这个空对象,而这个空对象的原型又等于父类原型对象(superType.prototype)的继承关系。

而 Object.create 支持第二个参数,即给生成的空对象定义属性和属性描述符/访问器描述符,我们可以给这个空对象定义一个 constructor 属性更加符合默认的继承行为,同时它是不可枚举的内部属性(enumerable:false)。

而 ES6 的 class 允许子类继承父类的静态方法和静态属性,而普通的寄生组合式继承只能做到实例与实例之间的继承,对于类与类之间的继承需要额外定义方法,这里使用 Object.setPrototypeOf 将 superType 设置为 subType 的原型,从而能够从父类中继承静态方法和静态属性。

10. 函数柯里化

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

柯里化是函数式编程的一个重要技巧,将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

函数式编程另一个重要的函数 compose,能够将函数进行组合,而组合的函数只接受一个参数,所以如果有接受多个函数的需求并且需要用到 compose 进行函数组合,就需要使用柯里化对准备组合的函数进行部分求值,让它始终只接受一个参数。

借用冴羽博客中的一个例子:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

11. 函数柯里化(支持占位符)

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

通过占位符能让柯里化更加灵活,实现思路是,每一轮传入的参数先去填充上一轮的占位符,如果当前轮参数含有占位符,则放到内部保存的数组末尾,当前轮的元素不会去填充当前轮参数的占位符,只会填充之前传入的占位符。

12. 偏函数

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

偏函数和柯里化概念类似,个人认为它们区别在于偏函数会固定你传入的几个参数,再一次性接受剩下的参数,而函数柯里化会根据你传入参数不停的返回函数,直到参数个数满足被柯里化前函数的参数个数。

Function.prototype.bind 函数就是一个偏函数的典型代表,它接受的第二个参数开始,为预先添加到绑定函数的参数列表中的参数,与 bind 不同的是,上面的这个函数同样支持占位符。

13. 斐波那契数列及其优化

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

利用函数记忆,将之前运算过的结果保存下来,对于频繁依赖之前结果的计算能够节省大量的时间,例如斐波那契数列,缺点就是闭包中的 obj 对象会额外占用内存。

14. 实现函数 bind 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

函数的 bind 方法核心是利用 call,同时考虑了一些其他情况,例如:

  • bind 返回的函数被 new 调用作为构造函数时,绑定的值会失效并且改为 new 指定的对象
  • 定义了绑定后函数的 length 属性和 name 属性(不可枚举属性)
  • 绑定后函数的原型需指向原来的函数

15. 实现函数 call 方法

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

原理就是将函数作为传入的上下文参数(context)的属性执行,这里为了防止属性冲突使用了 ES6 的 Symbol 类型。

16. 简易的 CO 模块

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

run 函数接受一个生成器函数,每当 run 函数包裹的生成器函数遇到 yield 关键字就会停止,当 yield 后面的 promise 被解析成功后会自动调用 next 方法执行到下个 yield 关键字处,最终就会形成每当一个 promise 被解析成功就会解析下个 promise,当全部解析成功后打印所有解析的结果,衍变为现在用的最多的 async/await 语法。

17. 函数防抖

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

leading 为是否在进入时立即执行一次, trailing 为是否在事件触发结束后额外再触发一次,原理是利用定时器,如果在规定时间内再次触发事件会将上次的定时器清除,即不会执行函数并重新设置一个新的定时器,直到超过规定时间自动触发定时器中的函数。

同时通过闭包向外暴露了一个 cancel 函数,使得外部能直接清除内部的计数器。

18. 函数节流

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

和函数防抖类似,区别在于内部额外使用了时间戳作为判断,在一段时间内没有触发事件才允许下次事件触发。

19. 图片懒加载

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

getBoundClientRect 的实现方式,监听 scroll 事件(建议给监听事件添加节流),图片加载完会从 img 标签组成的 DOM 列表中删除,最后所有的图片加载完毕后需要解绑监听事件。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

intersectionObserver 的实现方式,实例化一个 IntersectionObserver ,并使其观察所有 img 标签。

当 img 标签进入可视区域时会执行实例化时的回调,同时给回调传入一个 entries 参数,保存着实例观察的所有元素的一些状态,比如每个元素的边界信息,当前元素对应的 DOM 节点,当前元素进入可视区域的比率,每当一个元素进入可视区域,将真正的图片赋值给当前 img 标签,同时解除对其的观察。

20. new 关键字

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

21. 实现 Object.assign

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

Object.assign 的原理可以参考我另外一篇博客。

22. instanceof

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

原理是递归遍历 right 参数的原型链,每次和 left 参数作比较,遍历到原型链终点时则返回 false,找到则返回 true。

23. 私有变量的实现

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用 Proxy 代理所有含有 _ 开头的变量,使其不可被外部访问。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

通过闭包的形式保存私有变量,缺点在于类的所有实例访问的都是同一个私有变量。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

另一种闭包的实现,解决了上面那种闭包的缺点,每个实例都有各自的私有变量,缺点是舍弃了 class 语法的简洁性,将所有的特权方法(访问私有变量的方法)都保存在构造函数中。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

通过 WeakMap 和闭包,在每次实例化时保存当前实例和所有私有变量组成的对象,外部无法访问闭包中的 WeakMap,使用 WeakMap 好处在于不需要担心内存溢出的问题。

24. 洗牌算法

早前的 chrome 对于元素小于 10 的数组会采用插入排序,这会导致对数组进行的乱序并不是真正的乱序,即使最新的版本 chrome 采用了原地算法使得排序变成了一个稳定的算法,对于乱序的问题仍没有解决。

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

通过洗牌算法可以达到真正的乱序,洗牌算法分为原地和非原地,图一是原地的洗牌算法,不需要声明额外的数组从而更加节约内存占用率,原理是依次遍历数组的元素,将当前元素和之后的所有元素中随机选取一个,进行交换。

25. 单例模式

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

通过 ES6 的 Proxy 拦截构造函数的执行方法来实现的单例模式。

26. promisify

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

promisify 函数是将回调函数变为 promise 的辅助函数,适合 error-first 风格(nodejs)的回调函数,原理是给 error-first 风格的回调无论成功或者失败,在执行完毕后都会执行最后一个回调函数,我们需要做的就是让这个回调函数控制 promise 的状态即可。

这里还是用了 Proxy 代理了整个 fs 模块,拦截 get 方法,使得不需要手动给 fs 模块所有的方法都包裹一层 promisify 函数,更加的灵活。

27. 优雅的处理 async/await

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

使用方法:

干货总结:中级前端工程师必须要掌握的27个JavaScript 技巧 

无需每次使用 async/await 都包裹一层 try/catch ,更加的优雅,这里提供另外一个思路,如果使用了 webpack 可以编写一个 loader,分析 AST 语法树,遇到 await 语法,自动注入 try/catch,这样连辅助函数都不需要使用。

 

责任编辑:庞桂玉 来源: 今日头条
相关推荐
29合格前端工程师需要掌握JavaScript 技能
就是今天文章中代码对应的详细注释和具体使用方法放在我的GitHub上,源码可以在底部找到,希望这对你的工作和面试有所帮助。

2022-08-12 09:21:43

前端 JavaScript 代码
开发中必须要掌握Git技巧
本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会有出错的地方,欢迎指正。

2019-08-07 15:20:08

Git 开源 命令
8必须要掌握GitHub实用技巧
GitHubPages大家可能都知道,常用的做法,是建立一个ghpages的分支,通过setting里的设置的GitHubPages模块可以自动创建该项目的网站。

2020-04-08 17:10:03

GitHub 代码 开源
18 高级工程师必须强大JavaScript 技巧
今天我们一起来聊一聊18个高级工程师必须会的强大JavaScript技巧都有哪些吧。

2023-08-11 13:25:00

JavaScript
作为前端工程师,你应该了解 JavaScript 技巧
过去我写了很多垃圾代码,现在看起来很糟糕。当我再次看到那些代码片段时,我什至怀疑自己是否适合做一名程序员。

2023-12-27 14:12:40

JavaScrip 技巧
前端性能】必须要掌握原生JS实现JQuery
很多时候,我们经常听见有人说jquery有多快多快。在这个各种类库满天飞的时候,不得不说的是,能有原生JS快吗?

2015-05-07 15:13:22

JS实现JQuery JQuery
CSS必须要知道10技巧
本文介绍了DIV+CSS的10个技巧,其实也就是对常用的一些规则,属性以及HACK的问题进行了新的整理,在校中学习和实习的朋友必备。

2012-04-09 13:16:20

DIV CSS
必须要掌握 RabbitMQ 操作命令
除了通过Web管理页面来进行管理之外,我们也可以通过命令行来进行管理,之前松哥在RabbitMQ中的VirtualHost该如何理解一文中介绍过几个RabbitMQ管理命令。

2021-12-03 18:04:06

命令 RabbitMQ Web
禁用VBS,提高Windows 11性能,这个技巧必须要掌握
Windows11的安全措施可能会降低PC性能,在某些情况下,可以禁用这些安全协议来恢复电脑的性能。

2021-12-08 23:16:02

Windows 11 Windows 微软
Java开发必须要掌握加密方式
数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。

2018-06-12 15:55:07

编程语言 Java 加密方式
走近Web前端工程师前端工程师价值
这是一个很老的话题“前端工程师的价值体现在哪里?”。有人说:“前端工程师之于网站的价值犹如化妆师之于明星的价值。”一位好的Web前端开发工程师在知识体系上既要有广度,又要有深度。当然,Web前端工程师并不是设计师,每天接触最多的是代码,代码,还是代码。

2015-08-26 14:18:25

Web 前端工程师 价值
Linux运维工程师必须掌握基础技能有哪些?
这个问题挺好的,回答这个问题也是对自身的审查,看看自己还欠缺哪些。首先限定在Linux运维工程师上,回答仅代表我想到,不代表我都会。

2017-03-30 16:03:06

Linux 运维工程师 技能
必须要掌握Android冷启动优化
事件发生在发包上线的前两天,在某某云进行移动测试时,提示冷启动速度低于平均值的问题,之前自己也曾尝试过优化,但是发现效果并不是很明显,作为一个有追求的开发者,趁着有点空闲时间,要好好研究一下冷启动优化问题。

2019-06-20 17:39:12

Android 启动 优化
前端工程师常用8工具
本文为前端工程师介绍8个开发工具,其中包括HBuilder、SublimeText、PS、Dreamweaver等等,快来看看吧!

2019-06-24 09:40:17

前端 前端工程师 开发工具
无聊前端工程师
酷炫的前端工程师热衷于超越各种极限,他们总喜欢追逐最新、最优秀、最耀眼的用户界面框架和前端编程库。我们经常发现,他们一直在试图缩小Web程序与原生程序之间的差距,而且,正是由于这个原因,他们已将用户界面的外观和行为变得越来越像一款原生程序。

2015-09-30 10:25:03

前端 工程师
数据工程师需要掌握18Python库
本文对Python中在数据分析中需要掌握的库进行了整理,一起来看看吧!

2020-07-22 14:50:35

Python 数据分析 库
必须要知道,五Promise高级使用技巧
无论是在开发中还是在面试中promise都是一个非常重要的内容。常见的面试中都会问及到promise.then()、Promise.all或者配合asyncawait使用的方式。

2024-04-09 16:24:18

Promise 开发
Springboot强大类型转换功能,你必须要掌握
Spring3引入了一个core.convert包,它提供了一个通用类型转换系统。系统定义一个SPI来实现类型转换逻辑,定义一个API来在运行时执行类型转换。

2021-10-21 08:13:11

Springboot
IT人员必须要掌握几个网络测试命令详解
IT人员在平时工作中经常要去处理一些网络上的故障,掌握下面几个简单的命令将有助于你尽快检测出网络故障所在,从而节省时间提高工作效率。Windows系统下通过开始运行(或Win+R),输入cmd回车,在DOS命令行窗口中使用,Linux系统下在命令行终端下进行使用。

2019-12-27 15:05:11

Linux Windows DNS
爬虫工程师必须掌握Cookie知识点都在这里
上一篇我们在讲优酷弹幕爬虫的时候,引入了一个新的知识点:Cookie,由于篇幅有限当时只是简单的给大家介绍了一下它的作用,今天我们就来全面了解一下Cookie(小饼干)以及相关的知识!

2019-08-15 09:35:03

深圳SEO优化公司重庆百度竞价西乡建网站推荐眉山百度竞价哪家好漯河关键词排名包年推广价格昌吉优化价格白山至尊标王多少钱张家界SEO按效果付费价格安庆网站推广工具公司驻马店百度网站优化哪家好山南网站推广工具报价昭通英文网站建设茂名至尊标王推荐塘坑企业网站建设多少钱黄南网站建设设计庆阳至尊标王莱芜seo优化公司塔城seo网站推广哪家好毕节网站优化推广价格衢州seo网站优化推荐辽阳营销网站公司天水网站seo优化公司宿州建站报价石岩企业网站建设价格昭通关键词按天收费公司黄山网站seo优化公司鹰潭百度竞价包年推广价格中卫营销型网站建设公司阳泉网站优化按天扣费公司阜阳营销网站推荐抚顺网站优化按天扣费多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化