10个JavaScript常见高级知识点

news2024/9/20 10:47:48

今天,给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》,主要针对初级前端和想要面试找工作的同学,想要学好前端,除了要掌握JavaScript的基础知识外,还需要掌握一些高级的知识点。

学会了下面这些常见的高级知识点可以提升我们的开发效率,帮助我们更快的进阶,还能帮助大家在面试的时候能够和面试官谈笑风生。

好了,话不多说,一起开始学起来~~~

1. 防抖

定义:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

function debounce(fn, time){  let timer  return function(){    clearTimeout(timer)    let args = arguments    timer = setTimeout(()=>{      fn.apply(this, args)    }, time)  }}

2. 节流

定义:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。​​​​​​​

function throttle(fn, time) {  let timer = null  return function () {    if(timer) return    timer = setTimeout(() => {      fn.apply(this, arguments)      timer = null    }, time)  }}

3. 高阶函数

定义:接受和/或返回另外一个函数的函数被称为高阶函数。常见的像数组的map、reduce、filter这些都是高阶函数​​​​​​​

// 简单的高阶函数function add(x, y, fn) {  return fn(x) + fn(y);}function fn(num) {  return Math.abs(num)}add(-5, 6, fn); // 11

4. 函数柯里化

定义:函数柯里化指的是将能够接收多个参数的函数转化为接收单一参数的函数,并且返回接收余下参数且返回结果的新函数的技术。

函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。

示例:​​​​​​​

// 普通的add函数function add(x, y) {  return x + y}// 柯里化后function curryingAdd(x) {  return function (y) {    return x + y  }}add(1, 2)           // 3curryingAdd(1)(2)   // 3

实现:​​​​​​

function curry(func) {  return function curried(...args) {    if (args.length >= func.length) {      return func.apply(this, args);    } else {      return function(...args2) {        return curried.apply(this, args.concat(args2));      }    }  };}
// 用例function sum(a, b, c) {  return a + b + c;}let curriedSum = curry(sum);console.log(curriedSum(1, 2, 3)); // 6,仍然可以被正常调用console.log(curriedSum(1)(2,3)); // 6,对第一个参数的柯里化console.log(curriedSum(1)(2)(3)); // 6,全柯里化

5. 数组去重

① Set去重 ​​​​​​​

 const arr = [1,1,2,2,3,3,4,4,5,5]; const res = Array.from(new Set(arr)); console.log(res); // [1,2,3,4,5]

② filter去重 

const removeRepeat = (arr) => {  return arr.filter((item, index) => arr.indexOf(item, 0) === index)};

③ includes去重​​​​​​​

const removeRepeat = (arr) => {  let repeatArr = [];  for (let i = 0, len = arr.length; i < len; i++) {    if (!repeatArr.includes(arr[i])) repeatArr.push(arr[i])  }  return repeatArr;};

6. 数组扁平化

①flat方法​​​​​​​

const arr = [1, [2, [3, [4, 5]]], 6] function flatten(arr) {   return arr.flat(Infinity) // 嵌套深度 } console.log(flatten(arr)); // [1,2,3,4,5,6]

②toString ​​​​​​​

function flatten(arr) {  return arr.toString().split(',').map(item => parseFloat(item))}console.log(flatten(arr));

③正则 ​​​​​​​

function flatten (arr) {  let str= JSON.stringify(arr).replace(/(\[|\])/g, '');  str = '[' + str + ']';  arr = JSON.parse(str);  return arr}console.log(flatten(arr))

④循环递归 ​​​​​​​

function flatten(arr) {  let result = [];  for (let i = 0; i < arr.length; i++) {    if (Array.isArray(arr[i])) { // 是数组就递归调用上面的扁平化一层的代码      result = result.concat(flatten(arr[i]));    } else { // 不是数组,直接通过push添加到返回值数组      result.push(arr[i])    }  }  return result}console.log(flatten(arr));

7.深拷贝​​​​​​​

function deepClone(obj) {  // 原始类型和null直接返回  if (typeof obj !== 'object' || obj == null) return obj;
  let newObj = Array.isArray(obj) ? [] : {};  // 处理日期对象  if (obj instanceof Date) {    newObj = new Date(obj)  }  // 处理正则对象  if (obj instanceof RegExp) {    newObj = new RegExp(obj)  }  for (let key in obj) {    if (obj.hasOwnProperty(key)) {      // 如果属性为对象就进行递归      newObj[key] = typeof obj[key] == 'object' ? deepClone(obj[key]) : obj[key];    }  }  return newObj;}

8. getBoundingCilentRect

什么是getBoundingCilentRect?

getBoundingCilentRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。该函数返回一个对象,该对象有6个属性:top,lef,right,bottom,width,height,如图:

判断某个元素是否滚动到了可视区域内​​​​​​​

window.onscroll = function() {  const box = document.querySelector(".box");  // 获取浏览器窗口可视化高度  const clientHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight  // 获取box元素顶部到浏览器窗口顶部的距离  const boxTop = box.getBoundingClientRect().top  // 如果距离小于可视化窗口高度,就说明元素滚动到了可视区内  if (boxTop <= clientHeight) {    // 可以控制元素的显示隐藏或者进行其他操作  }}

9. IntersectionObserver

定义和用途

Intersection Observer API提供了一种异步检测目标元素与祖先元素或视口(可统称为根元素)相交情况变化的方法。

如果想知道一个元素有没有进入到可视区域内,第一种方法就是使用getBoundingClientRect,但是需要持续监听页面的scroll事件,就会带来不可避免的性能问题,而Intersection Observer API的出现就是为了解决这一问题。

使用方法

const observer = new IntersectionObserver(callback[, options]);
  •  callback(必填)
    当目标元素和根元素的交集超过指定阈值触发回调函数,此函数可接受两个参数:entries和observer

  • options(可选)
    用于配置回调函数触发的条件,有三个属性:

①root - 指定根元素,默认为浏览器视口

②rootMargin - 根元素的扩缩边距,控制计算根元素和目标元素的交集的区域范围

③threshold - 阈值,回调函数触发的条件

使用IntersectionObserver实现图片的懒加载​​​​​​​

// html代码<body>  <img src="" data-origin="./images/desktop_1.jpg" alt="">  <img src="" data-origin="./images/desktop_2.jpg" alt="">  <img src="" data-origin="./images/desktop_3.jpg" alt="">  <img src="" data-origin="./images/desktop_4.jpg" alt=""></body>
// js代码function observe() {  let images = document.querySelectorAll('img');  let observer = new IntersectionObserver(entries => {    entries.forEach(item => {      if (item.isIntersecting) {        item.target.src = item.target.dataset.origin;        observer.unobserve(item.target);      }    });  }, {    rootMargin: '0px 0px 300px 0px' // 监视区向下扩展300px  });  images.forEach(item => observer.observe(item));}observe()

10. 自定义事件

什么是自定义事件?

在开发的过程中,我们会监听很多的事件,比如:点击事件(click)、鼠标移动事件(mousemove)等等。这些事件是js给我们提供的,但是有时候这些事件并不能满足我们的开发需要,这个时候就可以用自定义事件来解决。自定义事件可以让我们自主命名事件名,并且可以通过特定的方法进行添加,触发以及删除。

如何使用

目前实现自定义事件的两种主要方式是js的 Event() 构造函数和 CustomEvent() 构造函数来创建。

①Event

Event() 构造函数,用来创建一个新的事件对象 Event。 ​​​​​​​

// typeArg: string类型,表示创建事件的名称// eventInit: object类型,可选项,参数包括:bubbles-表示该事件是否冒泡;cancelable-表示该事件能否被取消;composed:指示事件是否会在影子DOM根节点之外触发侦听器。let myEvent = new Event(typeArg, eventInit);

演示:​​​​​​​

const btn = document.querySelector('button');// 创建事件let myEvent = new Event('myEvent', {  bubbles: true // 是否冒泡});// 给按钮添加点击事件btn.addEventListener('click', function() {  // 触发自定义事件  dispatchEvent(myEvent)})// 给自定义事件添加事件监听器window.addEventListener('myEvent', function() {  console.log('触发了自定义事件') // 当调用 dispatchEvent(myEvent) 时就会触发监听})

②CustomEvent
CustomEvent() 构造函数, 创建一个新的事件对象 CustomEvent。​​​​​​​

// typeArg: string类型,表示创建事件的名称// eventInit: object类型,可选项,参数包括:bubbles-表示该事件是否冒泡;cancelable-表示该事件能否被取消;detail:表示该事件中需要被传递的数据 let myEvent = new CustomEvent(typeArg, eventInit);

演示:​​​​​​​

const btn = document.querySelector('button');// 创建事件let myEvent = new CustomEvent('myEvent', {  detail: { name: "黑马前端" } // });// 给按钮添加点击事件btn.addEventListener('click', function() {  // 触发自定义事件  dispatchEvent(myEvent)})// 给自定义事件添加事件监听器window.addEventListener('myEvent', function(e) {  console.log(`触发了自定义事件,name为${e.detail.name}`) // 当调用 dispatchEvent(myEvent) 时就会触发监听})

③Event 和 CustomEvent 区别
Event() 一般用来创建简单的自定义事件,而 CustomEvent() 支持传递参数的自定义事件,它支持 detail 参数,可以在detail中放一些需要传递的参数,并在事件监听函数中获取。 

 

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

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

相关文章

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS(Database Management System-数据库管理系统)&#xff0c;为这个业务系…

运动哪种耳机好用,推荐五款适合运动的耳机分享

​经常佩戴耳机的小伙伴都知晓传统的蓝牙耳机相对于有线耳机来说比较方便&#xff0c;但也存在着耳道一直堵塞导致细菌的滋生等因素的存在&#xff0c;但在近些年火热的骨传导耳机却能够将这些问题一一化解&#xff0c;基本可以说是百利而无一害&#xff0c;所以今天我就给小伙…

第一章 计算机系统体系结构

1.1 什么是计算机体系结构 本章的第一个概念是计算机系统(computer system)。 计算机系统包括读取并执行程序的 中央处理单元(CPU&#xff0c; 保存程序和数据的存储器以及将芯片转换为实用系统的 其他子系统。 这些子系统会使CPU与显示器、打印机、Internet等外部设备之间的…

【优化求解】整数规划求解机票超售优化赔付问题【含Matlab源码 2182期】

⛄一、问题 A航空公司每天有6班航班从上海到北京&#xff0c;从上午10点到晚上8点&#xff0c;每两小时发一班航班。某天获知&#xff0c;前三班机每班可以容纳100名旅客&#xff0c;后三班机每班可以容纳150名旅客。如果某次航班超售&#xff0c;A航空公司可以把某预定了该次…

【JSP/Servlet】基于WEB的通讯录系统

巩固JSP/Servlet系统开发描述步骤系统功能描述一、创建一个登录页面二、模拟数据&#xff08;用数据库模拟用户名和密码还有用户的通讯录&#xff09;三、创建一个JDBC工具类四、判断在登录页面输入的用户名和密码是否正确五、利用cookie实现保存六、以表格形式显示出我的通讯录…

2022最新MySQL面试题-有详细完整的答案解析

MySQL专题面试题 MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。 MylSAM存储引擎 在MySQL 5.1及之前的…

操作简单的BI数据分析软件有哪些?实际体验如何?

使用者没有IT基础&#xff0c;不懂代码&#xff0c;又需要对大量复杂的数据进行深度分析&#xff1b;分析效率要高&#xff1b;报表要直观易理解&#xff1b;最好能让每个浏览者都自己动手做分析。现在市面上&#xff0c;能够满足这些要求的BI数据分析软件有哪些&#xff1f;实…

一文速通MybatisPlus

目录 Mybatis-plus简介 MP特性 框架的结构 MP快速入门 配置日志输出 主键生成策略 自动填充 方式一&#xff1a;数据库级别 方式二&#xff1a;代码控制级别(常用) 乐观锁和悲观锁 测试乐观锁单线程成功的例子 乐观锁多线程失败案例 查询操作 分页查询 删除操作 删除…

C++ 手动实现单向循环链表(课后作业版)

单向循环链表&#xff0c;并实现增删查改等功能 首先定义节点类&#xff0c;类成员包含当前节点的值&#xff0c; 指向下一个节点的指针 循环链表的尾节点指向头节点 节点定义&#xff1a; //node definition template <typename T> class Node { public:T value;Nod…

Vue的生命周期快速入门

图示 流程 new Vue()实例化一个vue实例&#xff0c;然后init初始化event 和 lifecycle&#xff0c; 其实这个过程中分别调用了3个初始化函数&#xff08;initLifecycle(), initEvents(), initRender()&#xff09;&#xff0c;分别初始化了生命周期&#xff0c;事件以及定义cr…

k8s 资源管理及查看命令

关注 迪答数据 公众号获取更多 技术/数据 干货文章 文章传送门&#xff1a;数据治理之指标体系管理 管理容器的计算资源 参考文档&#xff1a; Kubernetes Managing Compute Resources for Containers(opens new window)https://kubernetes.io/docs/concepts/configuration/m…

go slice 扩容机制

前言 go语言没有ArrayList这样的封装&#xff0c;但是官方原生提供slice&#xff0c;底层就是数组存储&#xff0c;并且能自动扩容&#xff0c;相较于ArrayList的默认10&#xff0c;扩容5&#xff0c;slice的逻辑是有区别的。slice默认容量0。 demo go版本号 huahuaMac-min…

第一章 数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&a…

Transformer Fusion for Indoor RGB-D Semantic Segmentation

如何聚合多尺度特征这是一个问题&#xff0c;现有的方法大多通过卷积来实现&#xff0c;而很少在特征融合的地方使用长距离依赖&#xff0c;因此对于大物体的分割就会有挑战。本文提出基于transformer的融合策略&#xff0c;来更好的建模上下文。 TransD-Fusion包含①&#xff…

SpringBoot SpringBoot 开发实用篇 6 监控 6.4 info 端点指标控制

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.4 info 端点指标控制6.4.1 问题引入6.4.2 info 端点指标控制…

CleanMyMac4.12最新版mac系统内存空间清理教程

CleanMyMac X可以优化Mac系统。mac系统用久了&#xff0c;用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件&#xff0c;还能卸载应用程序。 Mac是不需要安装任何杀毒软件的&#xff0c;虽然不用杀毒&#xff0c;但是日常的清理还是有必要的&#…

单机高性能网络模型

传统网络模型 PPC和prefork 优点 实现简单 缺点 PPC&#xff1a;fork代价高&#xff0c;性能低父子进程通信要用IPC&#xff0c;监控统计等实现会比较复杂OS的上下文切换会限制并发连接数&#xff0c;一般几百 案例 世界上第一个Web服务器CERN httpd采用PPC模式Apache MP…

简单网页制作代码 HTML+CSS+JavaScript香港美食(8页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Spring 5有哪些新特性?这份spring5高级编程带你深入剖析,直击P8!

spring Spring 框架可以说是Java 世界最为成功的框架&#xff0c;在企业实际应用中&#xff0c;大部分的企业架构都基于Spring 框架。它的成功来自于理念&#xff0c;而不是技术&#xff0c;它最为核心的理念是IoC &#xff08;控制反转&#xff09;和AOP &#xff08;面向切面…