2024前端面试总结—JS篇(文档持续更新中。。。)

1、Event Loop(事件循环)机制

JS是单线程的非阻塞语言
为什么是单线程(如果js是多线程,那么两个线程同时对同一个Dom进行操作,一个增一个删,浏览器该如何执行?)
非阻塞(当代码需要执行一个异步操作,该操作不会立刻返回结果,主线程会挂起这个任务,再异步任务返回结果后再执行相应的回调)

2、原型链

每个函数都有一个属性prototype,这就是原型对象;如果我们拿这个函数通过new构造函数可以创建一个实例对象,这个实例对象自身会有一个指针(proto)指向它的构造函数的原型对象,这样再构造函数和实例对象之间就建立起了连接

使用原型链的作用

  • 避免代码冗余,公共的属性和方法可以放到原型对象中
  • 减少内存占用
  • 继承
  • propt (实例对象指向原型对象的指针,隐式原型,每个对象都有的属性)
  • prototype(构造函数的原型对象,显士原型,函数独有)
    在这里插入图片描述

3、操作数组的方法

索引方法名功能改变原数组返回内容用法
1push()在尾部添加元素返回数组的长度
2unshift()在头部添加元素返回数组的长度
3pop()在尾部删除元素返回删除的元素
4shift()在头部删除元素返回删除的元素
5slice()提取数组的一部分不会提取的新数组slice(开始位置,结束位置)提取内容不包含结束位置
6splice()删除数组的一部分返回删除的元素splice(开始位置,删除个数,插入元素)
7reverse()逆转放置元素位置返回逆转放置的数组
8sort()排序返回排序后的数组arr.sort((a,b)=>{ return a.key-b.key})
9join()将所有元素放入字符串字符串arr.join(‘/’) 什么都不加,用逗号分隔;只有引号是空白;
10for…in遍历数组更适合遍历对象,不建议遍历数组for( let value in arr){console.log(value, arr[value])}
11concat()连接两个数组不会
12forEach()遍历本身不会,如果修改了属性则会(可对数组进行深拷贝)无返回值arr.forEach((元素,索引,当前数组)=> {})
13map()遍历:本身不会,如果修改了属性则会(可对数组进行深拷贝)会返回新数组(需要加return否则是undefined)不会对空数组进行检测arr.map((元素,索引,当前数组)=> {})
14filter()按条件过滤不会新数组(满足条件项)arr.filter((value,index,arr)=>{return value>0})
15some()查找不会boolean如果所有元素都满足判断条件,则返回true,若所有元素都不满足判断条件,则返回falsearr.some(value=> value < 0)
16every()查找不会boolean此方法是将所有元素进行判断返回一个布尔值,如果所有元素都满足判断条件,则返回true,否则为falsearr.every((value,index,arr)=>{return value>0})
17indexOf()查找不会返回数组中某个指定的元素位置Array.indexOf(item,start)[NaN].indexOf(NaN) // -1
18includes查找不会返回一个Boolean[1, 2, 3].includes(2) //true; 返回布尔值,比indexOf更直观,对于NaN校验更准确
19lastIndexOf()查找不会可返回一个指定的元素在数组中最后出现的位置Array.lastIndexOf(item,start)
20fill()(ES6)用一个固定值填充返回新数组arr.fill(value, start, end)start–默认0;end–默认length
21find (ES6)查找不会返回满足条件的第一项(return)arr.find((value, index, arr)=> return value>0){} //两个参数,第二个为回调let param = [‘’].find((item)=>{// 同时检测多个字符串是否在当前内容中 return item==‘2’
22findIndex(ES6)查找不会返回满足条件的第一项的索引(return)arr.find((value, index, arr)=> return value>0){}//两个参数,第二个为回调
23reduce(return)numbers.reduce((preValue,currentValue)=>{return preValue + currentValue})//数组求和

4、数组遍历方法性能比较

  • 方法:通过一个时间函数,执行对应方法n次,计算时长
  • 结果:for循环遍历 < for…of遍历 < forEach遍历 < for…in遍历 < map遍历

5、深拷贝的方法

  • for 循环实现 ( for + push )
  • slice 方法 ( arr.slice(0) )
  • concat 方法 ( arr.concat() )
  • Es6的 … 扩展运算符 ( var […arrNew] = arr )
  • JSON.stringify()JSON.parse() (适用于对象的深拷贝,对象转为字符串后赋值给另一个变量)

6、数组去重的方法

  • for + for
  • for + indexOf
  • Set (Es6)
let arrList = [1,2,4,6,2,7,2]
let arrListNew = Array.from(new Set(arrList))
console.log(arrList)//[1, 2, 4, 6, 7]
  • filter + indexOf
let arrList = [1,2,4,5,2,1]
let arrNew = arrList.filter((item,index,arr)=>{ return arr.indexOf(item)==index;})
console.log(arrNew)

7、检验数组的方法(typeOf、instanceOf)

  • typeOf ( 返回一个字符串,如果检测数组返回 ‘object’ )
  • instanceof ( 返回一个布尔值,arr instanceof Array )
  • es5的 isArray (Array.isArray(arr))
  • 验证对象的构造函数 ( arr.constructor === Array
  • 检测对象的原型 ( Object.prototype.toString.call(arr)‘[object Array]’

8、数字精度处理(tiFixed、Number)

  • 简单的四舍五入*((0.1+0.2).toFixed(1);//0.3)有弊端:(2.445).toFixed(2)* IE显示2.45,但是chrome显示2.44
  • Math.round() 函数返回一个数字四舍五入后最接近的整数,但 2.445 * 100=244.49999999999997,不是244.5,Math.round(2.445 * 100) // 244
  • 先toPrecision取固定位数,parseFloat()解析字符串并返回浮点数
  • bigInt()
let test = '9999999999999999';
let num = BigInt(test)
console.log(num);//9999999999999999n
console.log(String(num));//9999999999999999

9、This指向问题

  • this出现在全局函数中,指向window
  • this出现在严格模式中,永远不会指向window
  • 当某个函数为对象的某个属性时,在这个函数内部this指向这个对象
  • this出现在构造函数中,指向构造函数新创建的对象
  • 当一个函数被绑定事件处理函数时,this指向被点击的这个元素
  • this出现在箭头函数中时,this和父级作用域的this指向相同
  • 修改this的指向:
    – 使用call、apply、bind修改this指向
    – 使用new关键字改变this指向

10、节流和防抖(针对相应跟不上触发频率这类问题)

  • 节流:设置一个定时器,在固定时间段内多次点击只会执行一次
// 
  • 防抖:在固定时间段连续点击,会清除掉上次点击的定时器重新计时,最终只会执行最后一次的点击
const debounce = (function(){//防抖函数
    let time = null;
    return function(fn, sec){
        clearTimeout(time);
        time = setTimeout(fn, sec)
    }
})()
// 滚动事件
 window.addEventListener('scroll', ()=>{
    debounce(()=>{
         console.log(Math.random());
     })
 });
<!-- 
 * @description: 
 * 功能:首次点击立即执行;n次点击判断与上次点击的间隔,
 * 如果大于指定时间,则立即执行,否则延迟执行。
!-->
 fangdou() {
      let num = Math.random();
      this.times = new Date().getTime();
      this.list.push(num);
      if (!this.times_old) {
        this.listAll.push(num);
        console.log(this.list);
        this.times_old = this.times;
        this.list = [];
      } else {
        let res = this.times - this.times_old;
        if (res > 1000) {
          this.listAll.push(this.list[this.list.length - 1]);
          console.log(this.list);
          if (this.timer) {
            clearTimeout(this.timer);
          }
          this.times_old = this.times;
          this.list = [];
        } else {
          if (this.timer) {
            clearTimeout(this.timer);
          }
          this.timer = setTimeout(() => {
            this.listAll.push(num);
            console.log(this.list);
            this.times_old = this.times;
            this.list = [];
          }, 1000 - res);
        }
      }
    },

11、垃圾回收机制

  • 垃圾指什么:指的是一些不再使用的内存;
  • 回收指什么:针对不再使用的内存,需要进行释放,以便再次使用;
  • 什么是垃圾回收:在JS中有一套自动的回收机制,通过一些回收算法,找出不再使用的引用的变量或者属性,由JS引擎按照固定周期释放其所占内存;
  • 常见的算法策略
    • 引用计数算法
      • 思路:记录每个变量使用次数,当被引用时标记 +1,当被其它值覆盖引用标记 -1,变为0时被垃圾回收器收回;
      • 优点:引用计数为0时,发现垃圾立即回收;最大限度减少程序暂停;
      • 缺点:无法回收循环引用的对象;控件开销比较大;
    • 标记清除算法
      • 思路:垃圾回收器在运行时会假设所有对象都是垃圾,全部标记为0;然后从根对象开始遍历,把不是垃圾的标记为1;清除掉所有标记为0的垃圾,回收其内存;然后把所有节点都改为0,等待下一次回收;
      • 优点:实现简单;能够回收循环引用的对象;是V8引擎使用最多的算法;
      • 缺点:在清除对象后剩余对象的内存的位置不变,出现一些内存碎片,需要重新分配;
    • 标记整理算法
      • 在标记结束后将不需要清理的对象向一侧移动,最后清理边界的内存
    • 分代回收算法
      • V8引擎主要使用标记清除算法和分代回收算法;
  • 自动回收什么时候执行:全局变量在关闭页面才会回收,局部变量在调用函数完之后就会回收;
  • 针对闭包:可以通过将内部变量置空null来释放内存;

12、闭包

13、bind、apply、call

(文档持续更新中。。。文中如有错误或者描述不清的地方,欢迎各位大佬指正;旨在巩固前端基础,相互进步!)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业计算机中了360后缀勒索病毒如何处理,360后缀勒索病毒处理建议

网络的不断发展与应用&#xff0c;不仅为企业的生产运营提供了极大便利&#xff0c;还极大地提高了企业生产效率&#xff0c;为企业的生产提供了有利条件。但网络的发展也为企业的数据安全带来严重威胁。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的…

【Linux】命名管道

文章目录 命名管道一、命名管道的原理二、命名管道的创建命令行中创建程序中创建 - mkfifo函数&#xff1a; 三、命名管道的使用命名管道实现server&client通信 四、匿名管道与命名管道的区别和联系 命名管道 如果涉及到在文件系统中创建一个有名的管道&#xff0c;那么就…

从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程完结)

文章接上一章&#xff1a; 从0开始搭建若依微服务项目 RuoYi-Cloud&#xff08;保姆式教程 一&#xff09;-CSDN博客 四. 项目配置与启动 当上面环境全部准备好之后&#xff0c;接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 数据库配置 新建数据库&#xff…

布局技巧及CSS初始化

一&#xff0c;margin负值巧妙应用 二&#xff0c;文字围绕浮动元素 三&#xff0c;行内块 四&#xff0c;CSS三角强化 五&#xff0c;CSS初始化 一&#xff0c;margin负值巧妙应用 制作盒子的细线边框&#xff1a; 鼠标经过li后变色&#xff1a; 二&#xff0c;文字围绕…

【单片机】使用AD2S1210旋变芯片读取转子位置和速度

最近在做单片机的子项目&#xff0c;经过近半个月的安装调试&#xff0c;第一阶段顺利完成了。只能说第一次做这种小工程确实缺乏经验&#xff0c;跟书本上学的还是有些出入。做下记录&#xff0c;方便后面来查看。 0. 实验要求 基于STM32单片机&#xff0c;使用AD2S1210旋变芯…

布局管理和样式表

目录 手动操作 相关功能解释&#xff1a; Qt Designer或者QC中的Spacer控件及其属性 网格布局 代码操作 setFocusPolicy() 如果不进行布局&#xff0c;意味着界面上的东西都是写死的。 当我们进行布局操作之后&#xff0c;控件的位置、大小一般会根据窗口缩放来自动调整。…

视频怎么去掉人声保留背景声?这4个简单方法你一定要知道

视频怎么去掉人声保留背景声&#xff1f;在日常生活中&#xff0c;我们经常会遇到需要将视频中的声音去除&#xff0c;尤其是要去掉人声而保留背景声音。这不仅在处理个人视频时非常有用&#xff0c;对于许多专业的视频编辑工作来说也是必不可少的。本文将为你介绍4个简单的方法…

RabbitMQ入门概念

目录 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; 1.2 应用场景 1.3 AMQP协议与RabbitMQ工作流程 1.4 Docker安装部署RabbitMQ 二、SpringBoot连接MQ配置 2.1 示例1 2.1 示例2 —— 发送实体 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; MQ&#xff08;Message…

solidworks 焊接型材库

型材库中有大部分型材 H型钢有49种 八角钢有40种 扁钢有60种 不等边钢有84种 槽钢有41种 也可以按照自己需要的去添加 下载地址https://download.csdn.net/download/jintaihu/19347986

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

3671系列矢量网络分析仪

01 3671系列矢量网络分析仪 产品综述&#xff1a; 3671系列矢量网络分析仪产品包括3671C&#xff08;100kHz&#xff5e;14GHz&#xff09;、3671D&#xff08;100kHz&#xff5e;20GHz&#xff09;、3671E&#xff08;100kHz&#xff5e;26.5GHz&#xff09;、3671G&#x…

幻兽帕鲁服务器多少钱?幻兽帕鲁服务器价格,2月最新

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

RTC实时时钟之读取时间

1. RTC 基本介绍 RTC(Real Time Clock) 即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 2. RTC 控制器 2.1 RTC的特点是:…

NC248:左叶子之和(C++)

1.题目描述 2.题目分析 我们以一个二叉树为例 左叶子的特点是什么&#xff1f; 是左节点并且没有左右孩子节点 所以我们用leftnode保存root->lefe节点&#xff0c;判断条件为leftnode存在&#xff0c;并且不存在leftnode->left和leftnode->right&#xff0c;如果满…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0&#xff0c;即原本[i,j]处不是0&#xff0c;例如由于i行的其他位置有0导致[i,j]…

Kali Linux初识

Kali Linux&#xff08;以前称为 BackTrack Linux&#xff09;是一个开源的、基于 Debian 的 Linux 发行版&#xff0c;旨在进行高级渗透测试和安全审计。它通过提供通用工具、配置和自动化来做到这一点&#xff0c;使用户能够专注于需要完成的任务。 包括 600 多种渗透测试工…

LeetCode 使循环数组所有元素相等的最少秒数

地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 难度&#xff1a;中等 题目描述&#xff1a;给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每…

【中关村开源生态论坛暨大模型智能应用技术大会】—— 探索AI和开源在未来的应用

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-9ttR7rpX3BzyF2C4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

任务悬赏系统搭建开发定制,任务分销系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、任务悬赏系统功能和运营方式 总结 前言 任务悬赏系统就是在小程序内可以做任务赚取佣金&#xff0c;这款系统主要针对手上有达人资源的用户可以冲一下这个项目…