JS性能优化之函数唯一标识以及自记忆函数

历史小剧场

朱元璋在平定天下前,曾向谋士征求意见。有一位名叫朱升的学者,告诉朱元璋“高筑墙,广积粮,缓称王”。这条策略在朱元璋最终取得胜利的道路中发挥了重要的作用。

知识铺垫

函数可以像对象一样,动态创建和分配属性

对象拥有的,函数都有

唯一的区别是:函数是可调用的,即函数会被调用然后去执行某项动作

  • 函数可以通过字面量来创建
function fn () {}
  • 函数可以赋值给变量、数组项,或其他对象的属性。
const fn2 = function () {}const arr2 = []
arr2.push(fn2)const obj2 = {}
obj2.fn = fn2;
  • 函数可以作为函数的入参和出参。
function fn3 (callback) {callback()
}
fn3(() => console.log('hello'))
  • 函数可以动态创建和分配属性
function fn4 () {}
fn4.name = 'fn4'
fn4.age = 18
console.log(fn4) //[Function: fn4] { age: 18 }

函数唯一标识

给函数设置一个 id 属性,作为唯一标识,在某些情况下可以提高性能,比如,
一个集合中的函数,不希望出现重复函数。

const store = {nextId: 1,cache: {},add(fn) {console.log("fn.id => ", fn.id)if (!fn.id) {fn.id = store.nextId++this.cache[fn.id] = fn}}
}
const fun1 = function () {}
const fun2 = function () {}
store.add(fun1)
store.add(fun1)
store.add(fun2)
console.log(store.cache)  // { '1': [Function: fun1] { id: 1 }, '2': [Function: fun2] { id: 2 } }

注意:ES6 的箭头函数是一种匿名函数的简写,它们不具有自己的 this、arguments、super 或 new.target。由于箭头函数的特性,它们不支持添加属性。

自记忆函数

过给函数添加属性来记住一些计算结果,之后再调用的时候就可以不用重新计算了,直接去属性中的数据,提高性能。(类似于缓存)以计算素数为例

function isPrime(value) {if (!isPrime.cache) {// 给函数添加一个 cache 来存储计算结果isPrime.cache = {}}if (isPrime.cache[value] !== undefined) {console.log(`命中缓存${value},直接返回${isPrime.cache[value]}`)return isPrime.cache[value]}let prime = value > 2;for (let i = 2; i < value; i++) {if (value % i === 0) {prime = false;break;}}console.log(`缓存里没有${value},结果${prime}存进去`)return isPrime.cache[value] = prime;  // 先执行 isPrime.cache[value] = prime, 然后执行 return isPrime.cache[value]
}
isPrime(3) // 缓存里没有3,结果true存进去
isPrime(4) // 缓存里没有4,结果false存进去
isPrime(5) // 缓存里没有5,结果true存进去
isPrime(10) // 缓存里没有10,结果false存进去
isPrime(10) // 命中缓存10,直接返回false
isPrime(5) // 命中缓存5,直接返回true

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

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

相关文章

c++指针悬空用nullptr还是NULL

在C中&#xff0c;指针悬空&#xff08;dangling pointer&#xff09;是指一个指针指向了曾经有效但现在已经被释放或重新分配的内存。为了避免悬空指针带来的潜在问题&#xff0c;通常的做法是将指针设置为一个明确的无效值&#xff0c;这样在后续使用该指针之前&#xff0c;我…

[AIGC] Nginx反向代理配置实战

Nginx 是一款高性能的 HTTP 和反向代理服务器, 在许多高访问量的网站中应用广泛。其常见用途之一是 “反向代理”, 这意味着它可以将来自客户端的请求分发到背后的多个服务器, 从而负载均衡并提高网站的性能和可靠性。下面&#xff0c;让我们以 mybaidu.com 反向代理到 www.bai…

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目

文章目录 DrissionPage爬虫库简介1. 浏览器操控模式&#xff08;类似于游戏中的后台模拟鼠标键盘&#xff09;2. 数据包收发模式&#xff08;类似于游戏中的协议封包&#xff09; 实战中学习需求&#xff1a;爬取Gitee开源项目的标题与描述解决方案1&#xff1a;用数据包方式获…

cfa三级大神复习经验分享系列(五)

先是我的无力吐槽&#xff1a;考前两天我打算印准考证的时候&#xff0c;因为忘记自己的密码&#xff0c;试了几次账号就被锁了。简直被自己蠢哭了~然后马上写信给协会&#xff0c;再一直打台湾办事处的电话&#xff0c;非常神奇的是他们居然是按照美国时间工作的&#xff0c;打…

SSL证书:守护个人信息安全的坚固盾牌

在数字化浪潮汹涌的今天&#xff0c;我们的个人信息如同一座座宝藏&#xff0c;吸引着不法分子的贪婪目光。数据泄露事件频发&#xff0c;让信息安全问题日益凸显。而在这个信息爆炸的时代&#xff0c;如何保护我们的个人信息安全&#xff0c;成为了一个亟待解决的问题。幸运的…

opecv在图片上打印中文汉字

1.C版本 c实现大都依赖CvxText和FreeType库&#xff0c;本文介绍一种除opencv外不依赖第三方库的方法。 &#xff08;1&#xff09;文件putText.h #ifndef PUTTEXT_H_ #define PUTTEXT_H_ #include <windows.h> #include <string> #include <opencv2/opencv.…

股票量化交易上手,一个特别简单却长期可用的交易策略,官方接口

股票实现程序化自动化交易的三个基础&#xff1a;获取数据、执行交易、查询账户。 以后说到策略示例的时候就不介绍接口的基础使用方法了&#xff0c;随便一个策略把过程写出来都会很啰嗦&#xff0c;尽量压缩内容吧&#xff0c;这些内容是面向新手的&#xff0c;大佬们忽略细节…

少走弯路:esp32(esp8266)中查询子字符位置的性能改进

在极致化个人开源项目 GitHub - StarCompute/tftziku: 这是一个通过单片机在各种屏幕上显示中文的解决方案 的性能过程中 发觉&#xff1a;在esp8266中 对于一个String中查找某个child string的方法一般是使用indexof这个方法&#xff0c;如下&#xff1a; String strAll&qu…

qq音乐sign逆向

qq音乐sign参数逆向 1.概览 参数sign长度40 多次调试发现&#xff0c;前缀zzb不变 2.打日志 跟站发现是vpm&#xff0c;在apply调用打上日志断点&#xff1a; 连蒙带猜知道&#xff0c;最终字符串四部分构成&#xff0c;zzb 24DC2798 HI0TvE4tOMqzN4w88oZCjQ EE0A88FE 1.把…

嵌入式0基础开始学习 Ⅱ 数据结构(1)数据结构

1.1 什么是数据 数据 (data) 是对客观事物的符号表示 在计算机科学中是指所有能入到计算机中并被计算机程序处理的符号的总称 数据元素 (data element) 是数据的基本单元 一个数据元素可以由若干个 数据项 (data item) 组成&#xff0c;数据项是数据不可分割的最小单位 数…

6天掌握Mysql基础视频【完整资料】

课程概述 数据库基本知识&#xff08;概念、分类、关系型数据库和非关系型数据库、SQL介绍、MySQL介绍、MySQL访问&#xff09;SQL语法规则数据库操作&#xff08;增、删、改、查&#xff09;数据表操作&#xff08;增、删、改、查&#xff09;数据操作&#xff08;增、删、改…

C++第二十一弹---vector深度剖析及模拟实现(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、基本结构 2、默认成员函数 2.1、构造函数 2.2、析构函数 2.3、拷贝构造函数 2.3、赋值操作符重载 3、数据访问 4、迭代器获取 总结 …

数字经济与资本市场的密切关系!

数字经济的崛起&#xff0c;如同一股强劲的东风&#xff0c;吹拂着经济社会的每一个角落&#xff01;它带来了“新领域”和“新赛道”&#xff0c;赋予了“新动能”和“新优势”&#xff0c;成为引领中国经济增长和社会发展的重要力量。如今&#xff0c;发展数字经济已上升为国…

人人都是产品经理,尼恩产品经理面试宝典(史上最全、定期更新)

《人人都是产品经理&#xff0c;尼恩产品经理面试宝典》&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V1 IT不老新物种 的定义 大龄男IT &#xff1a;APM 架构经理 项目经理 高级开发&#xff0c;没有中年危机 大龄女IT&#xff1a;DPM 产品经理 …

为什么宋以前权臣篡位多、宋以后权臣篡位少?

时代不同&#xff0c;主要问题也不同。天下的大气候&#xff0c;自然就要左右王朝的小气候。权臣篡位&#xff0c;得先有权臣。但是&#xff0c;如果当权臣都没有了&#xff0c;又怎么可能有权臣篡位呢&#xff1f;这是一个社会基础的变化。宋以后的主要矛盾是中原和草原的争锋…

springboot+vue+mybatis jsp二手商城系统+PPT+论文+讲解+售后

随着互联网发展对各个领域的影响&#xff0c;互联网为人们的生活和工作带来了翻天覆地的变化。为了提升学校在校学生学籍管理方面的工作效率&#xff0c;实现学校在信息化方面的发展&#xff0c;提出了学校学籍管理系统。论文首先介绍了学校学生学籍管理系统的研究背景&#xf…

Mongodb 可视化工具Robot 3t安装【windows环境下】

下载应用 打开连接点我 选择windows版本并点击下载 下载完毕&#xff0c;双击并傻瓜安装 连接数据库 点击图标&#xff0c; 点击create创建连接 填写host和port 如果有用户名密码的&#xff0c;在authentication里填写 5. save 并连接即可使用&#xff01;

【深入学习Redis丨第一篇】Redis服务器部署详解

前言 小伙伴们大家好&#xff0c;我是陈橘又青&#xff0c;今天起 《深入学习Redis》 专栏开始更新。本专栏将专为希望深入了解Redis的开发者、系统架构师以及数据库爱好者而写的免费专栏。从Redis的基本概念入手&#xff0c;逐步深入到其内部实现和高级用法。希望能帮助你更好…

[ARM-2D 专题] 1.开始:基本工程搭建,编译和开发环境配置问题解决

要开始使用ARM-2D&#xff0c;前期两个准备工作需要完成&#xff1a; 一块mcu内核为cortex-M的板子&#xff0c;带显示屏&#xff08;彩色TFT屏&#xff0c;分辨率建议320x240或以上&#xff0c;带TP更佳&#xff09;。基于这个板子可以正常运行的keil MDK的工程。 好了&#…

手写promise、call、apply、debounce、throttle 等

1、promise 1.1 实现resolve和reject class MyPromise {// 构造方法constructor(executor) {// 初始化值this.initValue()// 初始化this指向this.initBind()try {// 执行传进来的函数executor(this.resolve, this.reject)} catch (e) {// 捕捉到错误直接执行rejectthis.rejec…