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,一经查实,立即删除!

相关文章

使用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; 地表覆盖分布…

瑞士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;实施中小企业数字化赋能专项行动。数字化转型有利于中小企业降低成本、提高效率、加速转型升级…

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

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

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语…

【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;基本可以让人有深入其境…

全志R128基础组件开发——显示与屏幕驱动②

sys_config 参数说明 LCD 接口参数说明 lcd_driver_name Lcd 屏驱动的名字&#xff08;字符串&#xff09;&#xff0c;必须与屏驱动的名字对应。 lcd_model_name Lcd 屏模型名字&#xff0c;非必须&#xff0c;可以用于同个屏驱动中进一步区分不同屏。 lcd_if Lcd Inte…

Trinamic推出步进电机低压微型电机驱动芯片

前言 TRINAMIC运动控制有限公司宣布推出全球最小的具有专利技术StealthChop™的单芯片电机驱动器。TMC2300为2相步进电机设置了高达1.2A RMS的标准和1.8V…11V DC的电压范围&#xff0c;它只需最低的功耗&#xff0c;让人根本觉察不到有电机的存在。 从现在开始&#xff0c;您只…

手把手教测试,全网内容最全最深-jmeter-Recording Controller(录制控制器)

5.1.6.14.Recording Controller(录制控制器) 第一步&#xff1a; 第二步&#xff1a;点击启动按钮&#xff0c;生成证书。证书在jmeter的bin目录下。 第三步&#xff1a;设置代理 第四步&#xff1a;抓取https包需要安装证书&#xff0c;在浏览器edge中安装 未完待续。。。 手…

防火墙的基础知识点

目录 1. 防火墙的定义&#xff1a; 2. 防火墙分类&#xff1a; 3. 防火墙的发展进程&#xff1a; 3.1传统防火墙 (包过滤防火墙)---一个严格的规则表&#xff1a; 3.2传统防火墙(应用代理防火墙)---每个应用添加代理 3.3传统防火墙 (状态检测防火墙)---首次检建立会话表…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例&#xff1a;http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下&#xff1a; mbtiles目录结构 根据z&#xff0c;x&#xff0c;y获取对应mbtiles文件路径的工具方法 说明&#xff1a;重点是使用getMb…

数据结构总结

数据结构总结 数据结构系列的文章从基本数据类型到数据结构&#xff0c;涵盖整型、布尔值、字符串、列表、元组、字典、集合、堆、栈、链表、树和图&#xff0c;以及队列和环等相关内容。 这里再补充一点&#xff1a;树和图都有更高阶的“玩法”&#xff0c;那就是加权——为每…

面对近期行情大起大落的伦敦银需要关注什么?

近期经常有听到投资者抱怨说&#xff0c;伦敦银价格没有明显趋势&#xff0c;很难做。确实&#xff0c;我们从日线图看&#xff0c;金价处于一个比较宽幅的横盘区间当中&#xff0c;近期的行情也是大涨大跌。投资者认为&#xff0c;面对大起大落的行情无从下手。下面我们就来讨…