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

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

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

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

相关文章

2024/1/30 备战蓝桥杯 3-1 栈

目录 小鱼的数字游戏 P1427 小鱼的数字游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 表达式括号匹配 P1739 表达式括号匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 【模板】栈 B3614 【模板】栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 小鱼的数字…

使用Neo4j做技术血缘管理

目录 一、neo4j介绍 二、windows安装启动neo4j 2.1下载neo4j 2.2 解压文件 2.3 启动neo4j 三、neo4j基础操作 3.1 创建结点和关系 3.2 查询 3.3 更改 3.4 删除 四、技术血缘Demo实现 4.1 构建节点对象 4.2 构建存储对象 4.3 创建有属性关联关系 4.4 最后是图结果…

中科星图——2020年全球30米地表覆盖精细分类产品V1.0(29个地表覆盖类型)

数据名称&#xff1a; 2020年全球30米地表覆盖精细分类产品V1.0 GLC_FCS30 长时序 地表覆盖 动态监测 全球 数据来源&#xff1a; 中国科学院空天信息创新研究院 时空范围&#xff1a; 2015-2020年 空间范围&#xff1a; 全球 数据简介&#xff1a; 地表覆盖分布…

【四】【C++】日期类简单实现

编写GetMonthDay函数 int GetMonthDay(int year, int month) {static int monthDays[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month 2 && ( (year % 4 0 && year % 100 ! 0) || year % 400 0)) {return 29;}return monthDays[month]…

瑞士0.5米高程地形瓦片数据介绍

一、背景 瑞士是位于中欧的一个国家&#xff0c;以其美丽的自然风光、高质量的生活和强大的金融体系而闻名&#xff0c;其位于欧洲中部&#xff0c;四面环山&#xff0c;与德国、法国、意大利、奥地利和列支敦士登等国家接壤。瑞士境内有许多湖泊和阿尔卑斯山脉的一部分。瑞士…

在 Linux 中挂载新硬盘动态使用

目录 一&#xff1a;添加硬盘并且格式化 二&#xff1a;创建逻辑卷 三&#xff1a;挂载卷到目录 在 Linux 中挂载新硬盘并进行格式化的操作可以按照以下步骤进行&#xff1a; 一&#xff1a;添加硬盘并且格式化 查看现有分区状态和服务器安装的硬盘状态&#xff1a; df -…

node版本切换(nvm)

1.https://github.com/coreybutler/nvm-windows/releases 进入下载nvm管理器 点击下载如果访问不到&#xff0c;可以使用我已下载好上传的 2.将下载文件解压到nvm目录中 3.配置nvm的环境变量 在系统变量中添加&#xff1a; NVM_HOME &#xff1a;包管理器的文件目录 NVM_SYML…

Workfine:用「订阅制」破解中小企业数字化转型困局

中小企业是国民经济和社会发展的重要力量&#xff0c;是扩大就业的载体&#xff0c;是改善民生的关键。《“十四五”数字经济发展规划》明确提出大力推进数字产业化转型&#xff0c;实施中小企业数字化赋能专项行动。数字化转型有利于中小企业降低成本、提高效率、加速转型升级…

记录解决报错--These dependencies were not found jsencrypt lodash-es

1.场景 idea打包vue&#xff0c;报错退出&#xff0c;缺少依赖 These dependencies were not found jsencrypt lodash-es2.解决步骤 ①到相关目录下直接安装依赖&#xff0c;npm install --save jsencrypt lodash-es。我这里是没安装成功&#xff0c;原因是很多依赖冲突。…

大数据之水平切分用途原理

数据库的水平切分方案是一种将数据分散到多个数据库或表中的策略&#xff0c;以提高系统的可扩展性和性能。以下是关于水平切分方案的详细介绍&#xff1a; 基本原理&#xff1a;水平切分方案基于将数据按照一定的规则分散到多个物理独立的数据库或表中&#xff0c;每个数据库或…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

HarmonyOS--属性动画和显示动画

动画-组件参考&#xff08;基于ArkTS的声明式开发范式&#xff09;-ArkTS API参考 | 华为开发者联盟 (huawei.com) 在HarmonyOS的ArkUI开发框架中&#xff0c;动画主要分为两种类型&#xff1a;属性动画&#xff08;Property Animation&#xff09;和显示动画&#xff08;Expl…

Tensorflow2.0笔记 - Tensor的限值clip操作

本笔记主要记录使用maximum/minimum,clip_by_value和clip_by_norm来进行张量值的限值操作。 import tensorflow as tf import numpy as nptf.__version__#maximum/minimumz做上下界的限值 tensor tf.random.shuffle(tf.range(10)) print(tensor)#maximum(x, y, nameNone) #对…

贪吃蛇---C语言---详解

引言 C语言已经学了不短的时间的&#xff0c;这期间已经开始C和Python的学习&#xff0c;想给我的C语言收个尾&#xff0c;想起了小时候见过别人的老人机上的贪吃蛇游戏&#xff0c;自己父母的手机又没有这个游戏&#xff0c;当时成为了我的一大遗憾&#xff0c;这两天发现C语…

Filebeat日志采集到Logstash再到Elasticsearch集群

一、安装Logstash Logstash我也是在/data下创建了个logstash目录 和Filebeat一样去官网找到你相应的版本下载并解压,点击链接跳转官网:Logstash curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.10.1-linux-x86_64.tar.gz tar -zxvf logstash-7.1…

【LeetCode】每日一题 2024_1_30 使循环数组所有元素相等的最少秒数(哈希、贪心、扩散)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;使循环数组所有元素相等的最少秒数题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天的题目类型差不多是第一次见到&#xff0c;原来题目描述…

【PyCharm教程】PyCharm 安装、卸载和升级包

PyCharm 为特定的 Python 解释器提供了安装、卸载和升级 Python 包的方法。默认情况下&#xff0c;PyCharm 使用 pip 来管理项目包。对于 Conda 环境&#xff0c;您可以使用conda 包管理器。 在 PyCharm 中&#xff0c;您可以在Python 包工具窗口和 Python 解释器Settings/Pre…

化工企业能源在线监测管理系统,能源管理新利器

化工企业在开展化工生产活动时&#xff0c;能源消耗量较大&#xff0c;其节能潜力空间也较大&#xff0c;因此必须控制能耗强度&#xff0c;促进能效水平的稳步提升。化工企业通过能源现状的分析&#xff0c;能够实现能源使用情况的实时反馈与监管&#xff0c;从而达到节能减排…

直播不仅可以带货,还可以远程协作

直播是一种非常直观高效的信息共享模式&#xff0c;目前直播带货比较火&#xff0c;但我也不懂&#xff0c;现就我涉及的领域和实践做一些分享&#xff0c;目前我所做的直接互动分发系统在软硬件全系统闭环下&#xff0c;结合100ms级的低延迟&#xff0c;基本可以让人有深入其境…

洛宁县王范回族镇中原村新时代文明实践站工程竞争性谈判公告

洛宁县王范回族镇中原村新时代文明实践站工程竞争性谈判公告 (招标编号&#xff1a;HNSC-2024-004) 项目所在地区&#xff1a;河南省,洛阳市,洛宁县 一、招标条件 本洛宁县王范回族镇中原村新时代文明实践站工程已由项目审批/核准/备案机关批准&#xff0c;项目资金来源为国有资…