我们应该知道的 10 个高级 JavaScript 技巧

我们应该知道的 10 个高级 JavaScript 技巧

解构赋值

赋值解构是一种从数组或对象中提取值并将其分配给变量的简洁方法。
它简化了您的代码并提高了可读性。对于数组,可以使用括号表示法,对于对象可以使用大括号。

// 解构数组
const [firstItem, secondItem, ...rest] = [1,2,3,4,5];console.log(firstItem);  // 1
console.log(secondItem); // 2
console.log(rest);       // [3, 4, 5]// 解构对象
const {name, age, ...details} = {name: "leo",age: 25,phone: 'xxx',address: 'xxx'
}console.log(name);   // leo
console.log(age);    // 25
console.log(details) // {phone: 'xxx', address: 'xxx'}

扩展语法

我们可以使用扩展语法(…)将数组的元素或对象的属性扩展到另一个数组或对象。
这对于制作副本、合并对象以及将多个参数传递给函数非常有用。

使用扩展语法生成的新对象是深拷贝,也就是改变原对象并不会影响到扩展对象

// 复制数组
const originalArray = [1,2,3];
const newArray = [...originalArray];
console.log(newArray);  // [1,2,3]originalArray.push(4)
console.log(newArray);  // [1,2,3]// 复制对象
const obj1 = {a: 1, b: 2};
const obj2 = {c: 3, d: 4};
const mergeObj = {...obj1, ...obj2};
console.log(mergeObj);  // {a: 1, b: 2, c: 3, d: 4}obj1.e = 5;
console.log(mergeObj) // {a: 1, b: 2, c: 3, d: 4}

柯里化

柯里化是一种函数式编程技术,其中采用多个参数的函数被转换为一系列函数,每个函数采用单个参数。
这使得我们可以更好地重用和组合代码。

const multiply = (a) => (b) => a * b;
const multiplyByTwo = multiply(2);
const result = multiplyByTwo(5);console.log(result) // 10

缓存

它是一种缓存技术,用于存储昂贵的函数调用的结果并避免不必要的重新计算。

它会显着降低长期递归或消耗函数的性能。

const memoizedFibonacci = (function () {const cache = {};return function fib(n) {if (n in cache) return cache[n];if (n <= 1) return n;cache[n] = fib(n - 1) + fib(n - 2);return cache[n];};
})();

Promise 和 ASYNC/AWAIT

Promises 和 Async/Await 对于更优雅地处理异步操作并使代码更具可读性和可维护性至关重要。
它们有助于避免地狱般的回调并改进错误处理。

function fetchData() {return new Promise((resolve, reject) => {})
}async function fetchData() {try {const response = await fetch("https://xxx/data");const data = await response.json(0);return data;} catch (e) {console.error("Error fetching data:", e);throw e;}
}

闭包

闭包是捆绑在一起(封闭)的函数及其周围状态的引用的组合,闭包允许函数访问其创建时的状态
,即使该环境不再可访问。
它们对于创建私有变量和行为封装很有用。

function createCounter() {let count = 0;return function () {return ++count;};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

关于闭包的两个最大的误解:

  • 闭包是一种特殊类型的函数,可以访问其周围的作用域

    这是完全错误的,原因有二:

    1. 闭包不是函数
    2. 所有函数都可以访问其周围范围*
  • 要创建闭包,我们需要嵌套函数

    同样,完全错误 - 函数嵌套是无关紧要的!每当创建一个函数时,也会创建一个关联的闭包。

函数组合

函数组合是将两个或多个函数组合起来创建新函数的过程。

它鼓励代码重用并帮助逐步创建复杂的转换。

const add = (x) => x + 1;
const multiplyByTwo = (x) => x * 2;
const compose =(...fns) =>(x) =>fns.reduceRight((acc, fn) => fn(acc), x);
const addAndMultiply = compose(multiplyByTwo, add);
console.log(addAndMultiply(3)); // 8

proxy

proxy对象允许我们为基本对象操作创建自定义行为。它允许我们拦截和修改对象操作。例如
访问对象属性、赋值和调用方法。

const handler = {get: (target, prop) => {console, log(`Accessing property: $(prop)`);return target[prop];},
};
const targetObj = { name: "leo", age: 25 };
const proxyobj = new Proxy(targetObj, handler);
console.log(proxyobj.name); // Accessing property: name leo :

事件委托

事件委托是一种将单个事件侦听器附加到父级而不是每个子级的多个侦听器的技术。

可以减少内存使用并提高性能,特别是对于大型列表或动态生成的内容。

document.getElementById("parent").addEventListener("click", function (event) {if (event.target.matches("li")) {console.log("You clicked on an li element!");}
});

Web Workers

Web Workers 允许我们在后台与主线程一起运行 JavaScript 代码。

它们对于卸载 CPU 密集型任务、避免 UI 挂起并提高性能响应能力非常有用。

// 在主线程
const worker = new Worker("worker.js");
worker.postMessage({ data: " some data" });// 在worker.js文件
self.addEventListener("message", function (event) {const data = event.data; const computedResult = (() => {// .. 复杂运算})()self.postMessage({ result: computedResult });
});

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

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

相关文章

php hyperf 读取redis,存储到数据库

redis中排行榜中的数据 public function execute(string $date){$query ChannelConfig::query();$query->where(module_name, rank_reward);$rewardData $query->first();$rewards [];if( $rewardData ){$rewardContents $rewardData->content;foreach ($rewardC…

java.lang.NumberFormatException

1. 请解释NumberFormatException是什么&#xff1f; NumberFormatException是Java中的一个异常类&#xff0c;表示在将字符串转换为数字时出现了格式错误。当使用Integer.parseInt()、Double.parseDouble()等方法尝试将一个字符串转换为整数或浮点数时&#xff0c;如果该字符串…

VMware----基于 VMware 玩转 CentOS 虚拟机创建、克隆以及配置后台运行

查看原文 文章目录 一、安装 Vmware二、创建 CentOS7 系统的虚拟机三、克隆虚拟机四、设置虚拟机后台运行 一、安装 Vmware &#xff08;1&#xff09;打开VMware下载地址页面&#xff0c;滑动页面&#xff0c;找到如下界面&#xff0c;点击【下载】 &#xff08;2&#xff…

vscode如何开发微信小程序?JS与TS的主要区别?

要在 VS Code 中编写微信小程序代码并同步到 Git&#xff0c;需要安装以下插件&#xff1a; 1. 微信小程序插件&#xff08;WeChat Mini Program&#xff09;&#xff1a;此插件提供了微信小程序的语法高亮、代码提示、调试、上传等功能。 2. Git 插件&#xff08;GitLens、…

光伏电站的投资回报计算工具有哪些?

随着全球能源需求的增长和环境意识的提高&#xff0c;光伏发电作为一种可再生能源形式逐渐受到人们的关注。在短短几十年的时间里&#xff0c;光伏发电已经取得了显著的发展。光伏发电作为一项长期的投资&#xff0c;在建设时肯定会考虑投资回报问题。光伏电站的投资回报计算工…

本地电商平台商业模式 同城实体店引流获客方法

本地电商平台的商业模式通常是基于在线市场交易的。这样的平台允许本地商家在其上发布商品信息&#xff0c;消费者可以在平台上选择购买&#xff0c;并直接向卖家付款。商家可以通过平台获得更广泛的市场覆盖和销售机会&#xff0c;同时消费者也可以享受更加便利和多样化的购物…

RPC(3):HttpClient实现RPC之GET请求

1HttpClient简介 在JDK中java.net包下提供了用户HTTP访问的基本功能&#xff0c;但是它缺少灵活性或许多应用所需要的功能。 HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 H…

Neural Network——神经网络

1.feature reusing——特征复用 1.1 什么是特征复用 回顾我们之前所学习的模型&#xff0c;本质上都是基于线性回归&#xff0c;但却都可以运用于非线性相关的数据&#xff0c;包括使用了如下方法 增加更多的特征产生新的特征&#xff08;多项式回归&#xff09;核函数 在本身…

CCF编程能力等级认证GESP—C++3级—20230611

CCF编程能力等级认证GESP—C3级—20230611 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)春游密码合规检测 答案及解析单选题判断题编程题1编程题2 单选题…

Spring IOC 原理(二)

Spring IOC 原理 概念 Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系&#xff0c;利用 Java 语言的反射功能实例化Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上&#xff0c;还提供了 Bean 实例缓存、生命周期管理、 Bean 实…

JS中浅拷贝和深拷贝

本篇文章咱们一起来学习下JS中的浅拷贝和深拷贝&#xff0c;了解它们在内存上的区别&#xff0c;并掌握浅拷贝和深拷贝的常用实现方法。 引用赋值 在学习拷贝之前&#xff0c;咱们先来看一个常见的情景&#xff0c;如下图&#xff1a; 大家觉得这是深拷贝还是浅拷贝&#xff0…

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心 前言一. Amazon Connect 介绍 &#x1f5fa;️二. Amazon Connect 使用教程 &#x1f5fa;️1.我们打开URl链接找到对应服务2.输入Amazon Connect选中第一个点击进入即可&#xff1b;3.在进入之后我们就…

【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】七、内存管理 &#xff08;C/C内存分布、C内存管理方式、operator new / delete 函数、定位new表达式&#xff09; -CSDN博客 目录 一 . 泛型编程 二 . 函数模板 函数模板…

LeetCode算法练习top100:(10)贪心算法

package top100.贪心算法;import java.util.ArrayList; import java.util.List;public class TOP {//121. 买卖股票的最佳时机public int maxProfit(int[] prices) {int res 0, min prices[0];for (int i 1; i < prices.length; i) {if (prices[i] < min) {min price…

供应链管理:专业词汇积累

一、供应链管理专业词汇积累 序号词汇词汇英文解释1库存持有天数days on hand库存水平的度量标准&#xff0c;等于现有库存数量除以平均每日库存消耗量。2差异&#xff08;化&#xff09;延迟方法delayed differentiation一种供应链管理方法&#xff0c;即尽可能的保留和共享产…

Maven知识

文章目录 一、概念1、官方文档2、什么是Maven&#xff1f; 二、相关知识1、Maven生命周期1.1、clean1.2、default1.3、site 2、Pom文件3、Pom常用元素3.1、项目基本元素3.2、<properties\></properties\>3.3、pom继承相关3.4、依赖管理相关3.5、构建管理相关3.6、&…

使用ffmpeg将图片合成为mp4

首先在在图片文件夹输入cmd 这里确保已经安装ffmpeg并配置好环境变量。 然后这是我的文件夹目录&#xff1a; 将21张图片合成为mp4视频 这里使用如下命令&#xff1a; ffmpeg -framerate 1 -start_number 0 -i %d.png -c:v libx264 -pix_fmt yuv420p output.mp4 -framerat…

设计模式——中介者模式

引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建和修改客户资料的对话框&#xff0c; 它由各种控件组成&#xff0c; 例如…

最近IT圈子里有这样一句流行语:“Java已经死了,前端也已经凉了”?

Java与前端的发展前景 最近IT圈子里有这样一句流行语:“Java已经死了,前端也已经凉了”。这种极端看衰的语句似乎在散播焦虑,那么Java和前端的发展前景真的这么差吗? 就业市场而言,Java和前端仍然是最受欢迎的岗位之一。Java拥有强大的生态系统,前端技术发展迅速,都提供大量就…

[渗透测试学习] Analytics - HackTheBox

文章目录 信息搜集漏洞利用内核提权 信息搜集 nmap扫描一下端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.233发现两个端口&#xff0c;22端口为ssh服务&#xff0c;80端口有http服务 尝试访问80端口&#xff0c;发现重定向到http://analytical.htb/并且无法访问 编辑/…