很多新手写Js的时候只把功能做到了,却很少去考虑关于性能效率方面的事情,这是不可取的。我们应该习惯性地关注一下效率,因为你写的代码不可能永远只跑在性能还不错的设备上。

怎么提高?我教你啊!这里有五个小技巧

1. 缓存——localStorage和sessionStorage

localStorage和sessionStorage是现代web开发非常好用的功能。二者到底是什么呢?我们看看mdn上对他们的介绍

“These mechanisms are available via the Window.sessionStorage and Window.localStorage properties (to be more precise, in supporting browsers the Window object implements the WindowLocalStorage and WindowSessionStorage objects, which the localStorage and sessionStorage properties hang off) — invoking one of these will create an instance of the Storage object, through which data items can be set, retrieved and removed. A different Storage object is used for the sessionStorage and localStorage for each origin — they function and are controlled separately.”

大概意思是——这些机制可以通过Window使用。sessionStorage和窗口。localStorage属性(更准确地说,在支持的浏览器窗口对象实现了WindowLocalStorage和WindowSessionStorage对象,localStorage和sessionStorage属性挂断电话)调用其中的一个将创建存储对象的一个实例,通过这些数据项可以设置、检索和删除。不同的Storage对象用于sessionStorage和localStorage,它们分别起作用和控制。

说了一大堆其实用起来很简单,设置key和value存在浏览器缓存文件中下次可以再用。

虽然缓存很好用,但是这些API是同步的。也就是说,调用这个接口的时候主线程会被占用。此外,不管是localStorage还是sessionStorage都只能存字符串。用的时候记得要序列化和反序列化(JSON.parse和JSON.stringify)

举例:

const startTime = performance.now();
const testData = Array(1000).fill(true);store data
localStorage.setItem('foo', JSON.stringify(testData));retrieve data
const storedData = JSON.parse(localStorage.getItem('foo'));
const endTime = performance.now();
console.log(`time  ${endTime - startTime} ms.`);

在多次调用的情况下会发现有明显的卡顿。这是因为读取缓存IO操作会有较大的性能开销,多次IO操作导致卡顿。

这个时候可以在内存中做个缓存,比如:

const cache = {};export const getStorageValue = (key) = {if (cache[key]) {return cache[key];}const value = localStorage.getItem(key);return value === null  value  JSON.parse(value);
};export const setStorageValue = (key string, value unknown) = {cache[key] = value;localStorage.setItem(key, JSON.stringify(value));
};

可以解决一部分问题,当然具体使用场景要具体分析。

2. 使用web的Observe API


有时候,会有这样这样一个场景:有一个滚动的窗口,你要监听某些元素是否在屏幕某个位置。一般情况下,你是要监听scroll事件,然后在进行一些计算来判断是否满足条件。scroll事件不断触发,你需要不断计算,此时又合适用防抖来减少性能消耗,节流可能可以,但是,有没有更好的办法呢?有,那就是 Observe API

比如,InterpObserver,MutationObserver,ResizeObserver,分别用在是否可见,HTML文档是否被更改,元素的边框或者尺寸是否被修改。

(浏览器兼容性如下图,可以看到除了IE以外主流浏览器都是支持的)

3.接受提前返回


用if写判断并返回一个值的时候,我们经常给返回的值先存在一个变量中,等到所有判断结束后再统一返回这个变量,比如:

function calItem(i) {let result = undefined;if (i % 15== 0) {result = 'FizzBuzz';} else if (i % 3 == 0) {result = 'Fizz';} else if (i % 5 == 0) {result = 'Buzz';} else {result = i;}return result;
}

其实,没必要。

在这种简单的情况下,可以直接返回终止函数。

function calcItem(i) {if (i % 15 == 0) {return 'FizzBuzz';}if (i % 3 == 0) {return 'Fizz';}return  (i % 5 == 0)  'Buzz'  i;
}

这样看起来也更清爽,易懂,好改。

我知道,在某些关于code refactor或是一些基础教程中建议你按照上面的写法,一个函数只有一个出口比较方便,尤其是在C语言这种命令式语言中。但是在Js中我们经常不断拆分复杂函数,使得每个功能块尽可能短,在这种情况下,可以说,没必要。直接返回,干净清爽。

书是死的,人是活的。照着死规矩一成不变才是大忌。切记。

4.掌握 Async 和 Defer


你的页面里,script是怎么解析是非常重要的一件事情。用户进到你的网站后,script的解析处于竞争状态,所以你得了解你的script按照什么顺序执行才行,不然可能会有意想不到的Bug。

有三个选项:default,async,还有defer。default是默认的意思。得到script,执行。此时解析度进程会暂停,直到你脚本执行好后再继续。async,异步。页面解析和脚本执行同时进行。defer,等待。脚本则在页面解析完成后才开始。

理解什么时候脚本被执行非常重要。

根据经验,相互之间没有依赖的脚本标记async并行执行就好了。有依赖的话标上defer依次执行。

5.推迟非立即需要执行的任务

JavaScript是单线程异步的。所以有哪些代码不需要马上执行的,可以推迟点执行。降低优先级,让资源先用在高优先级的地方。

怎么操作呢?

有个好东西叫requestIdleCallback。看看MDN是怎么介绍的

“The window.requestIdleCallback() method queues a function to be called during a browser’s idle periods. This enables developers to perform background and low priority work on the main event loop, without impacting latency-critical events such as animation and input response.” — MDN Web Docs

大概是说,requestidlecallback()方法将在浏览器空闲期间调用的函数排成队列。这使得开发人员能够在主事件循环上执行后台和低优先级的工作,而不会影响延迟关键事件,如动画和输入响应。

可以在许多情况下应用此策略。其中最常见的是发送分析信息。我们不介意数据是早到还是晚到。这是一个非关键任务,因为它将由另一个服务异步处理。

比如:

const handleId = window.requestIdleCallback(() = {Analytics.sendEvent('purchaseProduct'....);
}, {timeout 2000
});

在这个例子中,我们将等待浏览器空闲时来执行我们的Analytics代码。如果这在接下来的两秒内没有发生,它无论如何都会被执行。超时时间为可选选项。它可以帮助您进一步定制代码的执行。如果该选项不存在,它只会在浏览器有时间时执行。

以上5个JS 小技巧,如果您认为对您有帮助,请记得 点赞留言分享收藏 哦~~

嫌JS写得不够好?我教你啊!五个小技巧相关推荐

  1. 手机ppt怎么添加页码_全网超详细的操作教程,手把手教你使用高效PPT小技巧!...

    相信同在职场中的你,同样离不开PPT.关于PPT的一些操作,如果不懂不会,非常浪费时间精力.于是,就会经常出现为PPT加班的事儿! 今天,我就为大家分享一个职场中经常会用到的两个PPT小技巧,那就是为 ...

  2. 快速从萌新变成老手!教你使用ThingJS的小技巧!

    之前给大家普及了怎么使用ThingJS在线开发平台中的"场景效果"."快捷代码"."场景信息",这个只是thingjs网站的一些基本使用方法 ...

  3. 播放量至少提升10倍,视频完播率低怎么办?教你4个实用小技巧

    有没有人做了很长时间的自媒体,但是作品一条热门都没有上过? 今天大周就来把自己做自媒体短视频多年的经验分享给大家,并不难,学会了你也可以. 首先大家要知道一点:上热门跟视频的完播率.点赞.评论和转发这 ...

  4. 怎么使用百度更精准搜索?我来教你6个搜索引擎小技巧

    1. filetype  搜索文件的后缀或者扩展名 filetype:   介绍:通过搜索引擎,获取指定类型的文件.   搜索示例:filetype:xls 将返回所有以xls结尾的excel文件的U ...

  5. 计算机快速切换快捷键,窗口切换快捷键,详细教您电脑窗口切换小技巧是什么...

    在电脑能够支持通过快捷键切换至我们所需要的任务窗口,从而帮助我们快速打开已经打开的应用/文件/文件夹,可能许多刚入手的用户还不知道如何操作,下面,小编就来跟大家讲解电脑窗口切换小技巧的方法. 电脑之所 ...

  6. 怎么制作出好玩的头像?教你制作个性头像小技巧

    怎么制作出好玩的个性头像呢?大家在一些社交媒体上都会有自己的专属头像,如果自己的头像给别人撞了就会非常尴尬,为了避免这种情况,我们可以自己制作头像,制作头像可以突出你的个性,让你在社交网络中更加突出. ...

  7. 教你1个转换小技巧,免费多张jpg合并成pdf

    工作中我们为了多张图片方便查看,一般会将其合并成一个pdf,今天小编和大家分享一个快速处理的方法,每天都可以免费转换,无需下载软件,打开搜索引擎,直接输入软件名称搜索,马上就可以进入网站的首页,界面简 ...

  8. 写个人简历的时候字体不完整?一个小技巧搞定!

    今天在修改个人简历的时候,发现有些字不完整,像是这样. 虽然不太明显,但大家仔细观察可以看到字的上面少了一小节,就像被剃了平头. 该如何修改呢? 首先选中需要修改的文字,右击选择段落 调整行距为1.5 ...

  9. 解压大型游戏(文件)时C盘空间不够?教你一个解压缩的小技巧

    解压时有两种操作: 将文件夹(文件)拖到要解压的目录 在解压缩软件中选择要解压的目录 看似相同的两种解压方式其实解压原理是不一样的. 先上结论:通过解压缩软件解压比手动拖动解压速度快很多,而且对C盘空 ...

最新文章

  1. android 官方默认动画,Android动画一:Activity过渡动画详细实现原理
  2. JavaWeb:上传下载文件
  3. python 多线程Thread
  4. python中的readalllines用法_什么是最好的编程语言?(怎样才能爱上编程呢?)
  5. vue2.0 keep-alive 缓存页面数据
  6. 离线pandas安装教程
  7. 元数据驱动的大数据服务平台
  8. BBR:Congestion-Based Congestion Control解读
  9. ARVR | AR技术发展简史(下)
  10. mysql32位的能装在64位的电脑上吗,32位处理器能装64位系统吗
  11. 麒麟座IIC-STM32F103RET6(2)-完成US延时
  12. Python学习:垃圾回收机制
  13. 二十九幅图片所展现的意境:壮美!
  14. 通过NFC挂载加载应用
  15. mvc报错template: “ServletContext resource [/WEB-INF/templates/index.html]“
  16. echarts柱状图图例不显示的问题
  17. 6.Libgdx扩展学习之Box2D_鼠标关节
  18. 网络游戏(联网进行的多人电子游戏)
  19. c语言设计模式--状态模式(状态机)
  20. VScode C语言项目文件配置

热门文章

  1. 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析
  2. 国密SM9算法C++实现之八:密钥交换算法
  3. fctix 中文输入法如何翻页
  4. Kinect虚拟试衣间开发(4)-2D衣物试穿
  5. Install GTK+ GLIB
  6. 小小知识点(二十八)开环空间复用和闭环空间复用
  7. 微信登录实现-Android
  8. Python--微信智能聊天机器人
  9. 统计建模与R软件第四章习题…
  10. mcrypt拓展_PHP添加mcrypt扩展模块