前端知识点(面试可看) —— 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的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和…...
vue封装基础input组件(添加防抖功能)
先看一下效果: // 调用页面 <template><div><!-- v-model:伪双向绑定 --><my-input v-model"inputVal" label"姓名" type"textarea" /></div> </template><script> import…...
小程序一次性订阅消息(消息通知):java服务端实现
文章目录 引言一、消息订阅1.1 小程序订阅消息功能介绍1.2 消息分类1.2.1 新版一次性订阅消息Beta1.2.2 一次性订阅消息(用户通过弹窗订阅)1.2.3 长期订阅消息(用户通过弹窗订阅)1.2.4 设备订阅消息 二、获取模板ID1.登录[微信公众…...
百度自由DIY小程序源码:PHP+MySQL组合开发 带完整的搭建教程
随着移动互联网的快速发展,小程序已成为企业与用户互动的重要平台。然而,对于许多中小企业和开发者来说,从零开始开发一款小程序需要投入大量的时间和资源。 以下是部分代码示例: 系统特色功能一览: 1.高度自定义&…...
Vue中的选项式 API 和组合式 API,两者有什么区别
Vue中的选项式 API(Option API)和组合式 API(Composition API)是两种不同的组件编写方式,它们各有特点和适用场景: 选项式 API(Option API): 传统方法:Vue最初的编程范式…...
Linux下误删除后的恢复操作测试之extundelete工具使用
一、工具介绍 extundelete命令的功能可用于系统删除文件的恢复。在使用前,需要先将要恢复的分区卸载,以防数据被意外覆盖。 语法格式:extundelete [参数] 文件或目录名 常用参数: --after 只恢复指定时间后被删除的文件 --bef…...
table表格中使用el-popover 无效问题解决
实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…...
c++类全面讲解
文章目录 前言类的基本概念基本结构类与结构体的区别示例代码 类的属性和方法属性(成员变量)方法(成员函数)访问修饰符示例代码 类的构造函数和析构函数构造函数析构函数示例代码 类的构造函数重载重载构造函数示例代码 类中的拷贝…...
使用Python和Pygame库创建简单的的彩球效果
简介 Pygame是一款强大的游戏开发库,可以用于创建各种有趣的图形效果。为了更好地了解Pygame的功能,今天我们将要做的是在屏幕上随机生成一些彩色的小球,并使它们以不同的速度和方向移动。当小球碰到屏幕边缘时,它们将反弹。 功能…...
第2课 使用FFmpeg读取rtmp流并用openCV显示视频
本课对应源文件下载链接: https://download.csdn.net/download/XiBuQiuChong/88680079 这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前,我们需要先用ffmpeg连接到rtmp服…...
【中小型企业网络实战案例 七】配置限速
相关学习文章: 【中小型企业网络实战案例 一】规划、需求和基本配置 【中小型企业网络实战案例 二】配置网络互连互通【中小型企业网络实战案例 三】配置DHCP动态分配地址 【中小型企业网络实战案例 四】配置OSPF动态路由协议【中小型企业网络实战案例 五】配置可…...
合肥网站建设网站模板/广告投放都有哪些平台
开发工具下载地址...
网站服务器错误/企业网站模板图片
简介:开发工具篇Maven 篇Git 篇其他工具篇开发工具篇Intellij IDEA 最常用配置详细图解Intellij IDEA 非常6的 10 个姿势Intellij IDEA 那些隐藏好用的小技巧Intellij IDEA Debug 调试技巧Intellij IDEA 阅读源码的 4 个绝 ...开发工具篇Maven 篇Git 篇其他工具篇开发工具篇Int…...
长葛做网站/营销必备十大软件
java错误-java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around 标签: aspectjrtaopjava2015-08-31 13:53 5521人阅读 评论(0) 收藏 举报分类:JAVA(61) 版权声明:本文为博主原创文章,未经…...
源码做网站教程/百度推广优化技巧
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼最近学习CUDA C的编程,在并行运行一个简单的解调算法的时候,统计时间后发现运行速度越来越慢(但还是运算结果正确的),后来简化到只运行其中一个核函数的时候,就算复杂度下降了&#x…...
wordpress 淘宝客 百度/淘宝热搜关键词排行榜
第1部分 宽带连接 因为MacBook电脑设计的比较薄,因此省去了宽带水晶头的插槽;但可以通过USB网络转换器来实现宽带连接。接好后,打开"系统偏好设置"-选择“网络” 点击左下角的“”,接口选择“PPPoE”,服务名…...
做网站需要什么 图片视频/西安互联网推广公司
2019独角兽企业重金招聘Python工程师标准>>> 一、什么是Jenkins的分布式构建和部署 Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows和Linux系统)中编译、部署等。 二、…...