前端知识点(面试可看) —— JS
摘要
马上就要毕业啦,没有参加2023年的秋招,准备在最近开始找全职或者实习工作,然后也马上过年了,总结和理一下自己的知识要点,参加2024年的春招。
1. JS的执行流程
- 浏览器的V8引擎收到到执行的JS代码
- V8结构化这段代码,生成AST(抽象语法树),同时生成相关作用域
- 生成字节码(介于AST和机器码之间)
- 解释器,按照顺序执行字节码,并输出执行结果
JS代码流程:先编译后执行
2. 基本数据类型
- undefined
- null
- Boolean
- String
- Number
- Symbol
- BigInt
- Object:只有他存在堆里面
3. 判断数据类型的方式(TTIC)
- typeof:判断基本数据类型,判断null时,会返回
object - Object.prototype.toString.call(xx):返回一个
[object 数据类型] - instanceof:
A instanceof B:判断A和B是否有血缘关系,不仅仅根据父子关系。 - constructor
4. ES6的新特性
const和let- 解构赋值
- 模板字符串
- 函数的扩展:默认值、rest参数、函头函数
- 数组的拓展:Array.from()将类数组转换为数组、find()、findIndex()、entries()、keys()、values(),includes()
- 对象扩展:属性名可以用表达式、Object.assign()、Object.keys()、Object.values()、Object.entries()
- Symbol
- Set、Map
- Promise
- Iterator和for…of
- Generator 和 async await
箭头函数和普通函数
- 语法更加简洁清晰
- 箭头函数没有 prototype、所以箭头函数没有
this - 箭头函数不会创建自己的this,
会自动继承最外层的this call | apply | bind无法改变箭头指向- 箭头函数不能作为构造函数
- 箭头函数不绑定arguments,用rest(…)取代,来访问箭头函数列表
- 箭头函数不用用作Generator,不能使用yield关键字
5. Promise 和 async/await
Promise
Promise对象为了解决
回调地狱而提出,不是新的语法功能,而是一种新的写法,允许将回调函数嵌套,改成链式调用
流程:
- Promise 接受一个executor(),在new的时候立刻执行
- executor()内部的异步任务被放入
宏\微任务,等待执行 - then,收集\失败回调
- executor的
异步任务被执行,触发resolve\reject,从失败和成功队列中取出依次执行。
其实是设计模式中的一种观察者模式:
- 收集依赖 (then收集)
- 触发通知 (触发resolve)
- 取出依赖执行 ( resolve执行)
async await
是对Generator(生成器)的封装,是个语法糖
*/yield和async/await的区别:
- async/await
自带执行器,不需要next()就能下一步 - async 返回的是Promise对象,而Generator返回的是
生成器对象 - await能够返回
Promise的 reject/resolve的值
注意:无论await后面跟的什么,后面的代码都会被阻塞
和Promise区别
Promise解决了回调地狱,但是他的语法问题纵向发展形成了一个回调链,遇到复杂的业务场景,这样的语法显然是不美观的。
async await看起来简洁一些,看起来像同步代码,其实它出现的意义就是提供异步的效果
两者其实都是非阻塞的
6. Generator
核心: 保存上下文,函数在真正意义中没有被挂起,每一次yield,其实都执行了一边生成器函数、在这个过程中用了一个context存储上下文,每次执行生成器函数的时候,都可以从上一个执行结果开始执行。
用babel编译后生成regeneratorRuntime
mark()方法为生成器函数绑定了一系列原型wrap()相当于给Generator增加一个_invoke方法
7. 迭代器
模式: 可以把有些结构称为可迭代对象,它们正式实现了Iterable接口,可以通过迭代器消费,是按需创建的一次性对象,每个迭代器都会关联一个可迭代对象
协议: 可迭代协议需要具备两种能力
- 支持迭代的
自我识别能力 - 创建实现
Iterator接口的对象的能力
是一次性使用对象,用于迭代与其关联的可迭代对象
迭代器api提供一个next()方法,这个方法会返回两个属性:
- done:是否还能取得下个值
- value:可迭代对象下一个值
默认实现了Iterable的类型
- String
- Array
- Map
- Set
- arguments
- NodeList等Dom集合类型
接受可迭代对象的原生语言特性包括
- for of
- 数组结构
- 扩展操作符
- Array.from()
- Set
- Map
- Promise.all()
- Promise.race()
- yield
8. 设计模式
三类:(C5S7B11)
- 创建型模式:五种: 工厂方法、抽象工厂、单例、建造则、原型
- **结构型模式:七种:**适配器、装饰器、代理、外观、桥接、组合、享元
- **行为型模式:十一种:**策略、模板方法、观察者(发布订阅)、迭代子、责任链、命令、备忘录、状态、访问者、中介者、模板方法、解释器
9. WebGL
Canvas 是画布一般可以获取2D上下文和3D上下文,3D上下文一般就是WebGL,当然WebGL也能用于2D绘制,并且WebGL提供硬件渲染加速,性能更好。但是支持性不是特别好,在不支持的情况下最好还是用Canvas,可以用一些兜底的库,如threehs、PIXI等
10. CommonJS和ES6 Module
首先,CommonJS是同步加载,ES6是异步加载,前者主要用于Node.js服务端编程,模块文件一般已经存在于本地硬盘,所以记载比较快。而后者是异步加载所以适用于浏览器,不会造成堵塞。
其次,CommonJS模块输出的是一个值的拷贝,也就是说一旦输出一个值,模块内部变化就影响不到这个值,ES6模块输出的是值的引用,V8引擎在对JS进行静态分析的时候,遇到import命令,会等到脚本真正执行时,才回到被加载模块中取值。
最后,前者是运行时加载,后者是编译时输出接口
注意:CommonJS不适用于浏览器
11. 声明变量的方式
ES5
- var
- function
ES6
- let
- const
- import
- class
12. 函数声明
- function fn(…args) {}
- var fn = function(…args){}
- new Function(‘x’,‘y’,‘return x+y’)
13. Object/Map/WeakMap区别
Map是ES6提供的一种新特性,是一种键不局限于字符串的一种键值对集合,对于Object来说他的键只能使用字符串。
WeakMap结构和Map有点类似,但是有两点区别:
- 他只接受对象为键(null除外)
- 键名所指向的对象,不计入垃圾回收机制
总之,WeakMap专用场合就是,它的键所对应的对象,可能会在将来消失,WeakMap结构有助于防止内存泄露。
14. JS深浅复制
浅复制
- 扩展运算符
- Object.assign()
- Object,getOwnPropertyDescriptors()+Object.defineProperties()
深复制
- 通过嵌套扩展运算符
- 使用JSON
- 手动实现(FHT)
- 利用
for-in对对象的属性进行遍历(自身属性+继承属性) source.hasOwnProperty(i)判断是否非继承和可枚举类型typoeof source[i]==='object判断值的类型,如果是对象,递归处理
- 利用
15. 闭包
闭包就是在JS种,根据语法作用域规则,内部函数总是可以访问到其外部函数中声明的变量,当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了。但是内部函数引用外部函数的变量依然保存在内存中,就把这些变量的集合成为闭包。
16. Event Loop
也就是事件循环,会不听从微/宏任务队列中取出对应任务的循环函数。在某种情况中,你可以把它称为一个永动机。这些它取出的任务并将其推送到调用栈种执行,主要有四个主要步骤:
- 执行Scirpt:用同步的方式执行
script,直到调用栈空才停下来。(还会执行预编译操作。如:变量提升) - 执行一个宏任务:挑选
最老的到调用栈中执行,直到调用栈为空 - 执行所有微任务:挑选
最老的到调用栈中执行,直到调用栈为空。(但是,继续从微任务队列种获取最老的执行。重复) - UI渲染:然后跳到
第二步,挑选宏任务执行。
Event Loop 单次迭代过程被称为tick。
宏任务 (Task Queue)
也被称为{回调队列| Callback queue},调用栈适用于跟踪正在被执行函数,宏任务则是跟踪将要被执行函数。
事件循环不停的运行着,并且按照一定规则从宏任务队列中不停的去除对象。
宏任务是一个
FIFO,存储的宏任务会被事件循环探查到。记得!这些人物都是阻塞的。
微任务(Microtask Queue)
和宏任务一样,他也是FIFO,同样会被探查到。不同的地方是,微任务是在一个宏任务完成后,在UI渲染之前被触发。它是专门处理ES6中Promise回调的。
17. GC
也就是垃圾回收机制。
如何实现(算法)
- 通过
GC Root标记空间中活动对象和非活动对象V8采用可访问性算法,来判断对象是否为活动对象- 是将一些
GC Root作为初始存活的对象的集合 - 从
GC Root出发然后遍历所有对象 - 通过遍历所得到的对象,认为该对象是否为
活动对象 - 通过遍历所得到的对象,认为该对象是否为
非活动对象 - 浏览器环境中,
GC Root包括1.全局的window对象 2. 文档DOM树 3.存放栈上变量
- 回收
非活动对象所占据的内存 - 内存整理
代际假说
是GC领域中的一个重要术语
两个特点:
- 大部分对象都是朝生夕死的
- 不死的对象,会获得很久
堆空间
V8会把堆分为两个部分
- 新生代
- 存放的是生存时间短的
- 1~8M容量
- 副垃圾回收器,负责新生代的垃圾回收
- 老生代
- 存放时间久的对象
- 主垃圾回收器,负责老生代的垃圾回收
副垃圾回收器
用Scavenge算法来处理,九十八新生代区域分为两个区域:对象区域和空闲区域。
当对象区域要被写满的时候,就做一次垃圾清理操作:
- 首先对对象区域的垃圾
做标记 - 然后把这些对象复制一份然后,有序的丢到空闲区域
- 然后复制结束后,两者角色互换
副垃圾回收器采用对象晋升策略:移动那些经过两次垃圾回收依然还活着的对象到老生代中
主垃圾回收器
负责老生代的垃圾回收,除了新生代晋升的,大的对象也会直接被存到老生代中,有两个特点:
- 活得久
- 大得很
标记|清除 算法
- 标记过程:从根元素遍历,能够达到的为活动对象,没有达到的为非活动对象
- 垃圾清理过程:主回收器直接把非活动对象清除
标记 - 整理
- 标记可回收
- 清除:不是对可回收对象清理,二十让所有的活动对象向一端移动,清理掉除了这里以外的内存。
18. 内存问题
内存泄漏: 不需要的内存数据但是依然被其他对象引用着。
常见的: 函数中声明变量时没有用var、let、const导致this指向window,直接赋值到window对象中。
19. 作用域
3大类:
- 声明式:函数作用域、module作用域
- 对象
- 全局
声明式作用域
通过var/const/let/class/module/import/function生成,常说的ES6块级作用域和函数作用域都属于函数式作用域
全局作用域
全局对象使用两个ER管理:
- 对象ER:将变量存储在
全局对象中,顶层作用域下,var和function声明的变量被绑定在对象ER中(浏览器为window) - 声明式ER:使用内部对象来存储,顶层作用于下,
const/let/class声明的变量被绑定在声明ER中
两者存在相同名的变量时,声明式ER优先级更高。
20. this
this是和上下文绑定的,主要分为三种:全局执行、函数执行、eval执行
全局
一般指向window对象,这是this和作用域链唯一焦点,作用域低端包含window对象
函数
默认情况调用一个函数,他的上下文也是指向window
通过call/bind/apply设置上下文:
let bar = {myName : " mango ",test1 : 1
}
function foo(){this.myName = " test "
}
foo.call(bar)
console.log(bar) // mango
console.log(myName) // not defined
this的设计缺陷
嵌套函数中,内部函数的this不会从外层函数中继承
解决方法:
- 将this转化为作用域体系。
- 使用
ES6中的this函数,他不会创建自己的上下文,所以取决于他的外部函数。
普通函数中的 this 默认指向全局对象 window
可以设置严格模式,函数上下文都是undefined
21. 图片懒加载
通过HTML提供的data-属性来嵌入自定义数据。
然后利用offsetTop计算位置。当图片出现在可视区域的时候,加载图片,也就是给img标签设置src。
22. 数组常用方法
改变原数组
- push
- pop
- shift
- unshift
- reverse
- sort
- splice
不会改变
- concat
- join
- slice
- filter
- reduce
- find
- findIndex
相关文章:
前端知识点(面试可看) —— JS
摘要 马上就要毕业啦,没有参加2023年的秋招,准备在最近开始找全职或者实习工作,然后也马上过年了,总结和理一下自己的知识要点,参加2024年的春招。 1. JS的执行流程 浏览器的V8引擎收到到执行的JS代码V8结构化这段代…...
CSRF总结
CSRF 文章目录 CSRF漏洞原理漏洞危害漏洞防护CSRF攻击流程CSRF和XSS的区别CSRF漏洞挖掘及利用 CSRF 跨站点请求伪造(CSRF)攻击者会诱导受害者点击事先伪造好的url或者链接,点击后,攻击者就可以盗用你的身份,以你的身份…...
降维算法的简单介绍
降维算法 降维算法: 通过减少数据的维度,如主成分分析和 t-分布邻域嵌入等。 降维通俗的讲,是通过减少数据的维度来处理高维数据的过程。降维算法有助于消除数据中的冗余信息,减少噪声,并提高计算效率。以下是一些常见…...
k8s的声明式资源管理
在k8s当中支持两种声明资源的方式: 1、 yaml格式:主要用于和管理资源对象 2、 json格式:主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件,所有的内容都…...
Git | tag相关命令
语法命令 git tag -h usage: git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]<tagname> [<head>]or: git tag -d <tagname>...or: git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit&g…...
【Java期末】学生成绩管理系统
诚接计算机专业编程任务(C语言、C、Python、Java、HTML、JavaScript、Vue等)10/15R,如有需要请私信我,或者加我的企鹅号:1404293476 本文资源下载地址:https://download.csdn.net/download/weixin_47040861/88697244 —————…...
顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音(mod_cti基于FreeSWITCH)
介绍 顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音 一、添加acl 打开ccadmin->点击配置文件->点击acl.conf->在</list>后面添加一条图中的信息->muqi是我自己设置的名字你们可以修改为自己需要的名字->添加好了点击提交XML->在运维调试点…...
SQL Server从0到1——报错注入
报错注入分为三类:隐式转换,和显示转换,declare函数 隐式转换: 原理:将不同数据类型的数据进行转换或对比 select * from test.dbo.users where (select user)>0 #对比 select * from test.dbo.users where ((sel…...
【python高级用法】线程
前言 Python通过标准库的 threading 模块来管理线程。这个模块提供了很多不错的特性,让线程变得无比简单。实际上,线程模块提供了几种同时运行的机制,实现起来非常简单。 线程模块 线程对象Lock对象RLock对象信号对象条件对象事件对象 简单…...
分布式高级知识点
分布式一致性算法: Paxos Paxos 是一种分布式一致性算法,用于在分布式系统中达成共识。它可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。 Paxos 算法的基本思想是,首先选出一个协调者(leader)。协调者负责向其他节点发送提案(proposal)。其他节点收…...
Linux 命令之 dpkg 的简单使用
查询已安装的软件包及其依赖关系 dpkg -s name...
Ubuntu20.04服务器使用教程(安装教程、常用命令、故障排查)持续更新中.....
安装教程(系统、NVIDIA驱动、CUDA、CUDNN、Pytorch、Timeshift、ToDesk) 制作U盘启动盘,并安装系统 在MSDN i tell you下载Ubuntu20.04 Desktop 版本,并使用Rufus制作UEFI启动盘,参考UEFI安装Ubuntu使用GPTUEFI模式安…...
访问学者J1签证的申请流程
访问学者J1签证是许多人前往美国进行学术研究和文化交流的重要途径之一。申请J1签证需要经过一系列步骤和程序,让知识人网小编带大家来了解一下申请流程吧。 首先,申请者需要确认自己符合J1签证的资格要求。这包括被美国的赞助机构或组织接受,…...
51单片机(STC8)-- GPIO输入输出
文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器(PxM0,PxM1)端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制(I/O输出)按键检测(I/O输入) S…...
【实用安装教程】在win系统下制作Mac OS镜像启动U盘
第一步:制作Mac OS系统引导镜像启动U盘 准备一个8G(或以上)的U盘插入到win系统的电脑上 去下载TransMac(Mac启动盘制作工具)v10.4按照说明安装好 插入准备好的U盘,U盘数据要转移,打开TransMac,右键U盘选…...
职场唠嗑-国家教学
文章目录 职场晋升潜规则:让上司看到自己工作能力职场生存指南:脆弱无罪,眼泪如何变利器关于具备谋取好职位的资格实习生在职场的基本“规矩”比能力更能决定人生的,是你对工作的态度跳槽:看别人家的“饭”端自家的碗职…...
【温故而知新】JavaScript数据结构详解
一、概念 JavaScript是一种弱类型的编程语言,它提供了一些内置的数据结构来存储和组织数据。 在计算机科学中,数据结构是一种特定的方式来组织和存储数据,以便于有效地访问和修改数据。在JavaScript中,数据结构是指相互之间存在…...
matlab如何标定相机内外参和畸变参数
关于内外参矩阵和畸变矩阵可以学习 https://blog.csdn.net/qq_30815237/article/details/87530011?spm1001.2014.3001.5506 在APP中找到 camera Calibrator 点击 Add Images,导入拍照图片。标定20张左右就够了,然后角度变一下,但不需要变太…...
【卫星科普】什么是农业一号卫星和农业二号卫星?
农业一号卫星和农业二号卫星是中国自主研发的两颗重要卫星,主要用于农业领域的监测和研究。 农业一号卫星是中国第一颗具备红边波段传感器的卫星,也是世界上第一颗具备红边波段的宽视场多光谱中高分辨率卫星。这对农业农村遥感监测非常重要,…...
imgaug库指南(一):从入门到精通的【图像增强】之旅
文章目录 引言imgaug简介安装和导入imgaug代码示例imgaug的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
