前端知识点(面试可看) —— 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的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Vue.js教学第二十一章:vue实战项目二,个人博客搭建
基于 Vue 的个人博客网站搭建 摘要: 随着前端技术的不断发展,Vue 作为一种轻量级、高效的前端框架,为个人博客网站的搭建提供了极大的便利。本文详细介绍了基于 Vue 搭建个人博客网站的全过程,包括项目背景、技术选型、项目架构设计、功能模块实现、性能优化与测试等方面。…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...

【AI学习】wirelessGPT多任务无线基础模型摘要
收看了关于WirelessGPT多任务无线基础模型的演讲视频,边做一个记录。 应该说,在无线通信大模型的探索方面,有一个非常有益的尝试。 在沈学明院士带领下开展 https://www.chaspark.com/#/live/1125484184592834560...