前端面试全面总结

1、行内元素有哪些?块级元素有哪些?空元素有哪些?

行内元素:、、、、、...

块级元素:、1、、、、、...

行内块元素:、(可以设置宽高)

空元素:、、、、

涉及元素之间的转换:属性

2、和@的区别

是的标签,@是的样式规则。

能加载样式文件、图片等资源,@只能加载引用样式

与引入的被同时加载(并行),@页面后加载(串行)。

后者兼容性差。

3、与1,与的区别,与的区别

是网页标题,1是内容。网站(网站搜索优化)层面上,级别更高

加粗:语义化区别,只是加粗,且有强调(阅读器)作用。

倾斜:多用在做图标,也有强调作用。

4、的和属性的区别

:鼠标移入图片时显示。

:图片不加载时显示。

5、、、的区别

:适合大图片,同样的图片相对用体积更小。(失帧)

:适合小图标,同样的图片体积更大。(失帧小)

:动态图

6、作用

是一种文档类型,它的目的是告诉浏览器(解析器)应该以什么样(或)的文档类型定义来解析文档。它必须在⽂档的第⼀⾏。

浏览器渲染页面的两种模式:标准模式和怪异模式。

7、标签的理解

标签由和属性组成,用来描述网页文档的属性。

,用来描述文档的编码类型。

:、、

8、和的区别

是单行文本框,通过属性限制字符长度,可以设置宽高,但始终是一行。

是多行文本输入框,使用和规定尺寸。

9、和的区别

:的缩写,直接加载出引入的资源。、、、。

当浏览器解析到该元素时,会暂停其他资源的下载和处理,进行资源请求。

:建立与外部资源的连接通道。、。

10、语义化标签

语义化就是用合适的标签用在最恰当的内容上。

1、没有样式情况下,语义化标签呈现清晰结构,方便机器和工作人员阅读代码。

2、有利于,提高关键字权重,使爬虫抓取更多有效信息,提高搜索引擎名次。

3、方便盲人阅读器等设备渲染页面。

11、5新增标签

:网页头部,:网页底部,:网页导航,:区段

:内容,:侧边栏。

12、5新特性——

1、各种新增表单类型:、、、、、、

、:选择表单

2、音视频——、

=""用户控制音乐, =""循环播放, =""自动播放。

3、画布——+

:画布,位置发生改变会重新绘制。——

:可缩放矢量图,基于。

4、本地存储——、

5、可编辑属性:

广泛应用在用在网页编辑器、编辑状态。在标签内部加入=“”

5、

在执行脚本时,页面的状态是不可相应的,直到脚本执行完成后,页面才变成可相应。

6、拖放事件

7、地理位置

13、是什么?怎么使用?

是可伸缩矢量图形,图形在放大或者改变尺寸的情况下图形质量不会损失。

画图:(矩形),(多边形)、(圆形,和定圆心)、(椭圆)

结合的产生动画效果。

14、是什么,怎么使用?

添加标签,设置、宽度和高度

通过获得标签,使用确定图片类型。

1、盒子模型

盒子模型:标准盒子模型、盒子模型

标准:+++。

:+(、、)

盒子模型转换:-:-(标准),-(盒子)

1、盒子塌陷与解决方案

盒子塌陷:内部盒子跑到父盒子的外部

原因:内部盒子脱离文档流

解决:清楚内部盒子浮动、父亲盒子高度写死。

2、-和的区别

-:每行文字的高度,如果文字换行则整个盒子高度增大(行数每行高)

:盒子的纯高度。

-:值,文字垂直居中。

3、选择器有哪些?哪些属性可以继承

通配符选择器(),选择器(#),类选择器(.),标签选择器。

相邻选择器(+匹配一个,~匹配多个),后代选择器(空格),并集选择器(,),子元素选择器(>),

属性选择器([])

可继承样式:字体系列,文本-、、-,-。

不可继承:、、、

3、伪类选择器和伪元素选择器

伪类

状态伪类:

否定选择器::()选中出来除了括里的其他元素

其他::-    :-    :-()    :--(锁定类型)

伪元素

::

::

::  设置选中文本的样式

4、优先级算法

!>内联样式>选择器>类选择器(属性、伪类)>标签选择器(伪元素选择器)>通配符

权重:       1000        100         10               1                                          0

5、画三角形(用)

和设置为0

一个边设置为:100 颜色

另外三个边框设置为:100 (透明)。

6、水平垂直居中

:-;:0 (水平居中)

1、用布局给父元素设置:

:;

-:;

-:

2、布局:

父::

-:

-:

或者直接写-:

3、用定位动画给自己设置

:;

:50%;

:50%;

:(-50%,-50%)

4、-

: -;

-: ;

-: ;

布局

弹性布局,

父元素:

子元素:

:排列顺序

:2 相当于 :2 1 0%。-为2,-为1(可伸缩),-为0

布局

--: 200 200 200;三列宽度

--: (3,200);

-: 5;每个单元格间距

定义区域,子元素-匹配

7、

:块级格式化上下文,就是将这容器变成完全的个体,不会影响到外面的元素。

可以触发的条件有:

不为,

不为,

:-,-

为、。

常用::

8、清除浮动影响的方式

1、触发,例如用:

2、:{

:;

:"";

:

}

9、定位

:默认值,不定位。

:相对定位,相对于原来自己进行定位。(对其他元素不太影响,不脱离文档流)

:绝对定位,相对于已定位的父元素进行定位(没有的话就是浏览器大框)。

:固定定位,相对于浏览器大框进行定位。

:粘性定位,在屏幕范围()时该元素的位置并不受到定位影响(设置是、等属性无效),当该元素的位置将要移出偏移范围时,定位又会变成,根据设置的、等属性成固定位置的效果。(页面变化++)

边偏移属性::100(向下100),,,。

(如果有上下左右,只要上和左的,则全有)

10、双飞翼布局(左右200宽,中间自适应,先加载中间)

1、中左右顺序设置模块,给左设置-:-100%,给右设置-:-200

2、子项目设置-属性,0为固定,1为可伸缩,自适应的设置:1

11、什么是

.,是一个文件,重置样式。

例如还有.,同样也是。

12、 是什么?优缺点?(雪碧图、精灵图)

是把多个小图标合并成一个大图片。

使用:或者第三方工具

优点:减少请求次数,提升了性能。

缺点,维护性比较差(如果内容更改)

13、进程和线程

进程:一个进程就是一个程序运行,启动程序,系统会为它创建一个内存,程序的一个运行任务会在一个线程,任务所在的大运行环境叫做进程。

线程:程序执行的最小单位。

线程依附于进程

进程的任意一个线程执行出错,都会导致整个进程的崩溃,其他线程不能运行。

一个大程序有多个进程,其中一个崩溃不影响其他的

浏览器进程:浏览器每一个页签都是一个的进程,进程内的线程只会影响自己。

渲染进程:将、、渲染成网页,浏览器回为每一个标签创建要给渲染进程。(包括渲染线程、线程,定时器线程)

13、浏览器渲染线程

根据,通过网络请求,得到服务器传来的代码,返回文本文件,浏览器将文件转成。

根据解析器对文件解析根据节点生成树,

根据解析器对文件解析生成。

将和整合形成 (计算布局数据)

根据 开始绘画渲染(重绘)、布局展示(回流)

(布局进行分层,每个图层生成绘制列表,图层分成块,光栅化图块转换成位图)

分层为了提高渲染性能,例如动画渲染不影响其他图层。

光栅化目的是将不需要的图块不做渲染。

提升图层:-:

遇到、时,去请求响应文件。

文件最好写在最后,不然会阻塞渲染,

14、:和:的区别。

:,隐藏后不占用原位置。产生重绘与回流。

:,隐藏后占用原位置。产生重绘,不会回流。

宽高都设置为0

原理:浏览器渲染过程↑ +重绘与回流(重排)↓

14、隐藏某个内容的方法

1、:0;

2、:;

3、:

15、重绘与回流(重排)

回流(重排):当 的元素改变了自身的宽高、布局、显示或隐藏,或者文字结构改变,产生回流。

重绘:只是改变各元素的外观(颜色等),产生重绘

回流必有重绘。

优化,避免回流:

不要使用 代码对 元素设置多条样式,选择用一个 代替之。

定位使用或者脱离文档流。

代替 , ,-, -... 这些位移属性。

16、透明:与的区别

都是实现透明的效果。

:取值0-1,0表示完全透明,1表示完全不透明。会继承给子元素

:(,,,透明度取值0-1),不会继承。

17、、、和的优先级

:/优先级最高,有他们在时,不起作用,值需要调整。 或者定位的元素,只能是块元素或表格。

18、解决上下重合的问题

在其中一个盒子外包一个,并对其触发

19、伪元素,:: 和 :中双冒和单冒有什么区别?解释一下这2个伪元素的作用

3规范使用双冒,单冒是等伪类。

3新特性

-、、、、

渐变::-

20、实现动画

常见属性

-:设置的属性名如

-:过渡时间

-:延迟时间

--:速度变化,默认(缓冲)

(四个可以合并使用。)

缺点:一次性,不能重复发生。需要事件出发,不能在网页加载时自动发送。只能定义在一个对象上。只有开始和结束状态。

可以实现上面缺点

除了上方四个属性,还有:

-:给动画起名字

--:循环次数

结合@ { }使用。

21、实现图(加载图),四分之三圆并旋转。

1、设置-:50%产生一个圆,再设置其中一条为透明色。

2、动画:为设置的四分之三圆设置旋转动画,用设置无限循环

22、布局

父级:

-:主轴方向

-:主轴上对齐方式(水平)

-:侧轴上对齐方式

-:是否换行

子级:

-:子元素在侧轴对齐方式

:排序,越小越靠前

:-(占比几份)、-(0固定、1自适应)、-()

23、、、、、区别

:像素单位

:-的大小,默认1=16,会继承。值对-变化而变化。决定部分

:根据根的-大小决定。1=16。值固定,可以调整整体文字。决定所有

、:宽高的1%

24、让超出宽度的文字显示省略

-:。设置为不换行

:超出隐藏

-:显示...

25、瀑布流布局

:+++:100

:(100%/)

26、

提供了一系列插件,对内容进行转换,后配置各种官方提供的属性插件,比如可以加浏览器前缀来兼容不同浏览器。

27、-失效情况

父元素设置为,子元素-失效。(解决:父元素改为)

设置,该元素-失效

28、是什么

浏览器自带,用于执行连续的动画,减少页面卡顿,提高动画性能。

实现动画通常是调整元素结合定时器。但是动画多,会卡顿,因为定时器是异步任务(要等主线程任务完成)。而且好像会有丢帧现象(刷新频率)

执行动画的时间由系统的刷新频率决定。传参是函数。

1、延迟加载有哪些方式

延迟加载:、(无论的位置在哪里)

两者区别:

:异步加载,此时的下载和的解析一起走,但不确定的执行顺序。

(最好): 异步加载并推迟执行,再执行文件代码,顺次执行脚本。

2、数据类型有哪些?

基本数据类型:、、、、、、

引用数据类型:(、)

数据类型转换:

()转化成字符串。

()转换成数字。有一个字符不是数值就返回

()转化成数字。第一个字符不是数字就返回

()转化成布尔值

2、和

可以给对象设置一个私密属性,别人访问不到。属性值不会被改写或者覆盖。

1 = ('');同一个变量生成的值也不相等。

和.都访问不到,可以用访问

大整数、提供一个表示大于2^53-1的整数。

只能支持-2^53-1到2^53-1的数,超过就会失去精度,被四舍五入。

= ("")

2、如何判断一个数是整数

1、+正则

2、结果与原值比较

3、.()

4、对1取余是否为0

2、数据类型判断:数据类型的判断_在寒夜等候光明的博客-博客_判断数据类型的方法

:判断类型, , , , ,(对象或者)

:一般用来判断引用数据类型的判断,如:,,,,等。原理:右边变量的 在左边变量的原型链上。

:当一个函数被定义时,会为函数添加原型,然后再在上添加一个属性,并让其指向的引用。

...()精准判断

3、和的区别

作者先设计的,后设计的。但是==,===,===

是“空”,是“未赋值”。

()结果是,()为0。

()为 ,()为

== 是,因为会被转化为数字: 被转化为 0, 被转化为 。

4、==和===的区别

==:比较的是值

其中原理是原型的隐式转换,在内部自动调用,不会显式改变。

===:比较的是值和数据类型。

4、隐式转换和显式转换

隐式转换:自动转换数据类型(转换了但是不显示),==判断、运算

显示转换:强制转换。()、()、()

5、的执行机制。

是单线程的语言,前一个任务执行完执行下一个任务。

同步任务:主线程上排队执行的任务。

异步任务:不进入主线程,进入任务队列。主线程任务完成,执行异步任务。

代码执行顺序是:同步任务=》进入任务队列的异步任务进行事件循环(微任务全部完成=》宏任务)

同步:,循环,紧跟着的代码。

微任务:.,的。

宏任务:,请求

6、关于作用域、变量提升:函数作用域 - 前端工程师面试题讲解_哔哩哔哩_

只有函数才会有作用域,循环可没有。

作用域分为全局作用域、局部作用域、块级作用域。

函数内部可以访问外部的变量,但是外部不能访问内部的变量。

优先查找内部的变量,内部没有,再去外部找。(作用域链)

的有提升,函数也会提升,函数的提升高于变量的提升。

7、对象考题

1、对象是出来的,所以相同对象不相等。【1,2,3】==【1,2,3】结果是。

2、对象是引用数据类型,数据在堆内存的一个共同的内存地址中。

3、对象的值都是字符串类型。

4、对象查找属性/方法的顺序:

对象自身——构造函数自身——对象原型——构造函数原型——

7、的有哪些

.(,,属性描述符)

直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

.()

返回给定对象的自身可枚举属性的数组

.()

返回给定对象的自身可枚举属性值的数组

.()

返回给定对象的自身可枚举属性和属性值的双层数组

.(1,2)

合并对象

.()

读取对象的原型对象

7、面向对象的三个特征

封装:可以隐藏实现细节,使得代码模块化

继承:可以扩展已存在的代码模块,为了代码重用

多态:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

7、模块化的和6的区别

都是模块化、

,前者是.+方式的模块化,输出的是一个模块的拷贝,运行时加载

,后者是 、( )方式的模块化,输出的是模块的引用,编译时加载

:异步加载模块

7、6新特性

、关键字

箭头函数

模板字符串

扩展运算符

解构赋值

数组方法

字符串方法

8、如何判断变量是不是数组?有几种办法?

方法一:.()

方法二:

实现原理: 在左边变量的原型链上

方法三:原型:..().

方法四:构造函数:..().("")>-1

9、和是干嘛的,是否会改变原数组

是切片,截取。

.(,):参数是开始索引,参数是结束索引。没有参数就一直到最后。

返回的是截取出来的数组。

:数组插值

.(,,):参数是开始索引,参数是选择个数,,参数是要替换的内容。

返回的是删除掉的元素。

两者都会改变原数组。

10、数组去重

1、+扩展运算符(使用于数组对象字符串)

2、循环+(新数组中-1时推到新数组)

3、+当前元素等于当前索引

11、操作符具体做了什么?

1、创建了一个空的对象

2、使空对象的原型指向构造函数的原型。

3、改变指向,指向该对象实例

4、对构造函数的做出判断。若一个基本类型则无影响,对象会改变为这个对象。

12、闭包

有全局变量和局部变量,函数内部可以访问函数外部的变量,但是函数外部无法读取函数内部的局部变量。

但是闭包可以做到,闭包是定义在一个函数内部的子函数,有权访问这个函数作用域中的变量。

我的理解闭包是函数内部和函数外部连接起来的桥梁。

优点:函数外访问函数内的值,可以封装对象的私有属性和私有方法。避免变量被垃圾回收。

缺点:变量会驻留在内存中,造成内存损耗。(解决:数据设置为)

原理:基本数据类型在栈内存,用完就销毁,引用数据类型在堆内存,有引用地址。

12、内存损耗的几种情况

闭包

未被清空的定时器

未被销毁的事件监听

引流

13、原型和原型链

所有的函数都有属性(原型),数组和对象没有,上可以设置属性和方法来继承给实例。实例对象都有____属性,对象的__指向构造函数的。逐层深入直到对象的原型,这样就形成了原型链。

对象查找属性/方法的顺序:

对象自身——构造函数自身——对象原型——构造函数原型——

13、、和

三个方法都是用来改变指向,

、可以立即执行,不会立即执行,可以赋值给一个对象。

和的第二个参数和后面参数依次写,的参数是数组。

14、浅拷贝和深拷贝

都是的意思

浅拷贝:只引用地址,不真正的值。要改变一起改变。

场景1: =[1,2,3]        2=

场景2:.()和.()

场景3:引入库,使用方法

场景4:.()类数组转为真数组。

深拷贝:真正的值。

场景1:2=.(.(1))

场景2:2=[...1]和.(对象来说,一层是深拷贝,多层是浅拷贝)

场景3:库的()方法

15、、、的区别

都是在客户端存储数据

:当前浏览器关闭,永久保存,设置的数据()也会存在。存储不能超过5

:当前浏览器关闭,设置的数据也会消失。存储不能超过5

:可以设置过期时间,过期前一直保存。存储不能超过4

16、、、、区别

和:在用户登录后,服务器会创建一个对象,存储用户的登录状态和一些用户信息。然后,服务器会给客户端发送一个包含 的。当客户端再次发送请求时,会自动带上这个,服务器就可以通过 找到对应的对象,从而识别用户。

和:是一种基于令牌的身份验证方式,它可以在客户端和服务器之间传输,用于验证用户的身份。( )是一种特殊的,它是一种基于的开放标准( 7519),用于在各方之间安全地传输信息。由三部分组成:头部()、载荷()和签名()。头部通常包含类型()和加密算法;载荷包含数据;签名是对头部和载荷进行加密的结果。前端请求头传

16、怎么让支持小于12的文字?

的默认字体是16,

可以通过将元素设置属性

(行内块并进行动画缩放。)

17、端:如何禁止&长按时触发系统菜单、长按时下载图片、用户选中文字

禁止端长按时触发系统菜单:

全局设置:

禁止端长按时下载图片:

全局设置:

禁止端用户选中文字:

全局设置:

18、自适应(不同手机型自适应内容)

引用端

引入淘宝无限适配的文件

布局单位使用

19、响应式、媒体查询

响应式就是一个可以适配端和端中调整。

语法结构:

关键词::只支持媒体查询的浏览器

:设备

-丨-   -丨-

响应式图片:对图片尺寸进行优化。使用标签(可替换他图片)

20、布局方案

使用响应式布局的情况:

数据不是很多,用户量不是很大的展示类页面

例如:官网、专题页面

大网站若采用大量响应式,会造成网页加载缓慢。

+双端网站使用的布局:

是一个,会加入一些响应式。

端是另一个,会使用自适应的布局方式。

21、、、的区别

三者都是用来变量。

区别1:有变量提升,和没有。

区别2:可以覆盖同一变量,和会报错。

区别3:和的变量可以改变,的常量不可修改。

区别4:和会产生块级作用域,没有。

21、暂时性死区

和会有他们所在的作用域,进入作用域时,的变量已经存在了,但是不可获取,只有等到变量的那一行时,才可以获取和使用变量。

提升,所有没有暂时性死区,未达到时为。

22、箭头函数和普通函数的区别

1、指向:

箭头函数指向=该箭头函数外层第一个普通函数的,且不可修改

普通函数或方法:谁调用指向谁

匿名函数的:匿名函数具有全局性,指向

2、箭头函数不能(不能当做构造函数)

3、箭头函数没有。

4、箭头函数没有。

22、关于的相关问题

函数传参时,会把所传的参数全部存到一个名为的类数组对象中。

有了这个对象我们以后写函数的时候,就不用给所有的形参指定参数名,直接使用对象来获取实参。

23、回调函数和回调地狱

回调函数:作为实参进入另一个函数,并在此函数中被调用。解决异步问题。

回调地狱:多个回调函数嵌套的话,使代码看起来很混乱,不利于维护。

24、、的区别( , )还有和呢?

:是一组不重复数据的,可以用于数组去重。

(两个空对象不重复,是两个值,因为内存地址不同。)

方法:可以遍历(.()),长度,添加,判断是否有

:(类似的字典)是存放键值对的,键和值都可以是任意数据类型

通过实例.()的方法给添加键值对。

可以遍历,方法、等。

:对象的,成员都是对象。

不能遍历,方法有

:键名只能为对象,不能遍历,对象只作为键、不被引用的话自动清除,不计入垃圾回收机制,上同。方法有

25、什么是函数的柯里化?怎么解决?

柯里化:把一个多参数的函数转化成单参数函数的方法,多参数各分一个函数。

核心:函数里面返回函数

作用:参数依次延迟执行。

实例:中经常使用的,实现的机制就是

26、数组和伪数组(类数组)的区别

数组是特殊对象,有各种从原型中继承的数组方法。

类数组是简单对象,有属性,但不能调用数组方法。(对象、等获得的),对象也算是伪数组。

类数组转换成真数组:

1、.()

2、[...伪数组]

3、..()。属性遍历并组成新的数组

26、各种数组方法:常用的数组方法__的博客-博客_数组常用方法

增删、、循环、、、、、、、

27、了解6的吗?

,代理。产生对象前,对其拦截包装操作

28、继承

1、原型继承:父类的实例作为子类的原型。

缺点:引用类型改变后会被共享。

2、构造函数继承, = ()

缺点:子类不能访问父类原型上的属性

3、上面两个组合继承。

缺点:调用两份一样的父类的属性方法。影响性能。

4、寄生组合继承:

5、6的类继承:+

29、图片懒加载:实现图片懒加载原理_的博客-博客_图片懒加载

图片按需加载,如果页面没到该图片,则不加载

实现办法:

加载完页面,使用-存储每个标签的值。

获取图片上边界().和浏览器可视高度,并比较

通过把-的值赋值给的属性。

然后生效。

最简单方法:设置属性=""

30、原生操作

创建新节点::创建一个具体元素。

添加:()

移除:()

替换:()

插入:()

克隆:()

设置和获取属性:("属性名","属性值"),("属性名")

30、是什么?

浏览器对象模型。也就是浏览器操作

:()、()、(1、-1)

:属性:地址、域名、端口、路径、参数

、、

30、事件冒泡和事件捕获

事件冒泡:事件向上传导。子事件的点击事件被触发,祖先元素的点击事件依次会被触发。

事件捕获:与冒泡相反,从父到子。

,第三个参数默认冒泡

.()组织冒泡

.()阻止默认事件

@.=

30、内置对象

、、、、、、、。

31、对于的了解

是一种数据交换格式,采用键值对,键值都是字符串。

32、的垃圾回收机制(主要是堆内存)

垃圾回收:找到不再使用的变量,释放掉其占用的内存。

标记清除:函数中的变量被标记,当函数执行完,将变量的内存释放,其他的先进空闲区域。

引用计数:内存变量被引用就+1,变量用完-1,直到0释放。

=1;

=100,1的空间不用了,垃圾回收。

32、避免内存泄露的方式

导致内存泄露有:定时器未清除、闭包、脱离引用

尽可能少地创建全局变量(因为一直在,不会被垃圾回收)

手动清除定时器

少用闭包

清除引用

使用弱引用和(垃圾回收时不会将创建的键值考虑进去)

33、严格模式

使用:

概念:消除语法中的不合理、不严谨、不安全的地方,减少怪异行为,保证代码正常运行

限制:全局下的指向。

构造函数必须加。

函数不能有重名的参数。

34、和的理解?

:模型-视图-控制器

传送指令到

完成逻辑后,通知改变状态

发送新数据给,完成视图更新。

:--

:数据访问、数据存储

:界面

:和的信息转换

35、异步编程的实现方式

1、回调函数

2、事件监听

3、

4、

和函数名之间有星

内部使用 定义不同状态,类似于

5、、

35、谈谈对的理解

是异步编程的一种解决方案,可以解决回调地狱。

有三种状态:(啥也没发生的初始状态、进行中),(完成),(失败)

有、两个结果,分别传递对应两种参数。

继续用链式调用,异常用,还有。

.():等待机制,所有成功再执行,是数组,返回结果也是数组。

传参数组为空,立即执行

.():赛跑机制,有一个操作完成就可以执行。

传参数组为空,不会执行。

36、什么是和?

将函数标记为异步函数,返回的是对象

实现异步函数同步执行

承接一个实例,直接得到.成功的结果,遇到具体值,就是.(这个值)

第一个之前的代码会同步执行。之后的代码会异步执行(后执行)。

37、和的区别

可以写在标签中,只能写在代码中。

只能绑定点击事件,可以绑定各种事件。

绑定多个事件会覆盖,不会。

第三个参数是冒泡事件,是捕获事件。

38、事件对象

事件对象:当事件对应的函数触发时,浏览器都会将事件的相关信息传递给响应函数

事件对象包括的信息:鼠标坐标(.、.)、键盘键位、滚轮方向……

.:返回触发事件的对象

.:阻止默认行为

.:阻止冒泡

:元素可视区域宽度,宽度+边距+边框。:加上滚动条

:元素可视区域高度。

:垂直滚动距离

:元素上边框宽度。

:元素左边框的宽度。

39、实现页面跳转

..=" "

.()

.(-1)

.()

40、.(,)?

合并:实现对象的合并

覆盖:如果已有属性重名,覆盖。

:的是属性值,即引用地址,(浅拷贝)。

41、 和

适合遍历数组, 适合遍历对象。

遍历对象会报错。

遍历的是数组的索引,对象的属性,以及原型链上的属性。

42、小知识点

!!双重取反,不为布尔值时为。??是合并运算符,当左边不为和时,返回左边,否则返回右边判断对象是否有某个属性, 返回布尔值,()高阶函数:将函数作为输入或返回值的函数。.是发生事件的元素或触发事件的元素。()函数可以接受一个字符串作为参数,并把此当做一段代码去执行运算会忽略掉求值的结果,直接返回 、.() 方法返回一个给定对象自身可枚举属性的键值对数组。数组方法.(),返回的元素。数组方法.(元素),判断数组是否有某个元素。数组扁平化:(2或):递归深度遍历数组,并合并成新数组(多层变一层)。(会移除空的项)判断字符串是否以某个字符串开头或者结尾:、.(1,2,3)=[1,2,3],将传入值变成数组,装饰器,扩展类型的属性和方法

43、手写前端面试手撕题整理(自用)_笔经面经_牛客网

手写一个的

手写并封装一个请求

手写

44、大文件上传

45、、、、

:元素可视区域宽度,宽度+边距+边框。:加上滚动条

:元素可视区域高度。

:垂直滚动距离

:元素上边框宽度。

:元素左边框的宽度。

46、单点登录

47、

浏览器是一个线程,而且只有一个主线程。如果有一些复杂计算,主线程执行会很慢。

于主线程。允许可以在浏览器后台线程中运行代码,不影响页面的响应。

可以进行图形处理、复杂数据计算。

但是无法访问和,不能访问本地存储。

需要使用和结合使用

使用:

一种脚本运行在于主线程的背景下,提供了一种方式来拦截和处理网络请求,实现离线缓存、消息推送等功能。 使得者能够以更精细的方式控制缓存,是构建 ()的关键技术之一

是什么

将网页作为应用程序安装在智能设备上的技术。

48、.

再浏览器创建3图形。

三要素:场景、相机、渲染器

场景:要显示在3的对象。 .()创建场景实例,并设置属性(颜色等)

相机:视角和范围

渲染器:结合场景和相机

添加物体

添加光源:.,在.

1、生命周期有哪些?

1、系统自带的八个有:

、、、、、、、。

2、进入页面,执行的生命周期有:

、、、。

3、产生数据(有@),开始挂载(有@),组件初始化完毕,数据可以使用。

4、当有-时,多两个生命周期:、

当有-时,第一次进入组件执行的生命周期:

、、、、

当有-时,不是第一次进入组件执行的生命周期:

只执行

在-组件激活之后当隐藏缓存组件时触发

-组件的使用

- 可以使被包含的组件保留状态,缓存组件,避免被销毁。

原理:写了要给函数存储需要缓存的组件数据,再路由函数获取数据。

组件的为什么必须是一个函数?

对象中,写成一个函数实际就是形成一个闭包。

数据出来,相当于每个组件实例都有自己的私有属性。

如果不写成对象,一个的某个值改变,其他组件的也会受影响。

2、谈谈你对-的了解

-是系统自带的一个组件,切换组件时,把切换出去的组件保留在内存中。

防止重复渲染,提升性能。

(组件被包裹在-标签中。)

3、-和-的区别

- 为时,此节点直接消失。

-为是,依然存在,样式改为:。

-更高的消耗。-适合频繁切换。

-和-的优先级

在源码里,-比-先进行判断,所以-的优先级更高。

写在一个标签里会报错,

解决:外层包裹一层或者加上-。

4、干嘛用的?

在()中的数据修改后,页面中无法获取修改后的数据。

使用$时,当中的数据修改后,可以获得实时的渲染页面。

(是页面渲染后执行的函数)

(后面用箭头函数,指向)

使用场景:想要获取、更新列表后的高度。

5、和的优先级谁高?

>

6、、有什么区别

:监听属性,监听一个已经存在的属性,值改变时,会调用对应的方法。无缓存

:计算属性,根据已有的属性改变时,计算出一个新的属性。有缓存。

7、事件修饰符和按键修饰符有哪些

事件修饰符

@.=“事件名” ,阻止默认行为

@.=“事件名” ,阻止冒泡

:只触发一次

按键修饰符

@.="事件名",键触发事件

@.13="事件名",空格键触发事件

表单修饰符

-.=

-.=

-是什么,它的用途?

文件的一个加载器,将、、转换成模块。

用途:可以写6、样式

的作用

作为每一个元素的唯一标识,来区别不同,同时通过算法更新时更加高效。

如果以为值,逆序删除时可能会导致渲染。可以用唯一性作为比如手机。

算法和虚拟

虚拟:框架会根据结构创建虚拟节点树,状态改变时,算将两个虚拟进行对比,根据对比结果计算出变化然后应用到真实中。

算法根据 复用 节点,通过节点而不是创建新节点来减少 操作。(双指针),比较两个虚拟树

对于每个新的 ,在旧的 中根据 查找一下,如果没查找到,那就新增 节点,如果查找到了,那就可以复用。

复用的话要不要要判断下下标,如果下标在 之后,就不需要,因为本来就在后面,反之就需要。

最后,把旧的 中在新 中没有的节点从 树中删除,

形成新的虚拟。

的双向数据绑定如何实现的?试题-实现数据双向绑定的原理是什么? - 校招

(对于表单元素,-绑定数据+触发相应函数,使数据更新。)

实现一个监听器,用来劫持并监听所有属性,如果属性发生变化,就通知订阅者;

实现一个订阅者,用来收到属性的变化通知并执行相应的方法,从而更新视图;

实现一个解析器,用来解析每个节点的指令,对模板数据和订阅器进行初始化;

响应式原理

的响应式是通过.()方法(2)或者方法(3)实现的,通过.()或劫持各个数据属性的和。当数据变动时会发布消息给订阅器,触发相应的监听事件渲染视图。

.(,,属性描述符)

直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

,代理。产生对象前,对其拦截包装操作

为什么.()不可以监听数组,可以

1、 方法允许你定义或修改一个对象的属性,并且可以对这些属性进行枚举和配置。然而,这个方法只能作用于对象的具体属性,而不能作用于整个对象,尤其是不能递归地作用于对象的子属性,比如数组的元素。

2、 可以让你拦截并定义特定操作的自定义行为,可以在数组上工作,递归地代理对对象或数组的操作。

(单页面应用)和(多页面应用)的区别及缺点

指只有一个主页面的应用,浏览器一开始就加载所有的、、,所有的页面内容都在这个主页面中,写的时候还是分开写。单页面的页面跳转只刷新局部资源。

:一个应用的资源分布在不同页面,页面跳转就整页刷新。

优缺点:

优点:不用重新加载用户体验好。不用整个刷新服务器压力小。

缺点:前进后退导航不可用。第一次加载资源过多

解决首屏加载慢

例如项目首屏加载

1、路由动态写成箭头函数,动态加载,

2、静态资源本地缓存。以后请求直接拿缓存。

3、按需引入组件库

4、压缩图片资源

中事件绑定加括和不加括的区别

@=“”

不带括、不写实参的默认传 (事件对象)

@=“()”

只要加括,无论是否传值,都属于传实参给函数, (事件对象)就接收不到。

@=“($, )”

如果需要实参、又需要

改变深层数组

.(对象名,属性,属性值)、.(数组名、索引、值)

也可以使用数组方法等

-实现原理

-双向绑定实际上做了两步动作:

1、绑定数据

2、触发输入事件;也就是说,-等同于:

为什么要加个

标签中添加 属性后, 就会为当前组件中的 元素添加唯一的一个自定义属性 --。防止样式冲突。

混入

局部混入,

在 外部命名变量对象(里面写语法),再在里引入

全局混入,(可以写插件)

过滤器

.用于文本格式化、数据转换,3移除。

父子组件传数据

8、(子传父)

父:

9、 (父传子)

父:

子:

10、 (子给父)

子:

父:

兄弟组件传数据

12、全局事件总线

() {..$ = //安装全局事件总线},

$.$给

$.$拿

$.$

13、-插槽

父组件写插入给子组件。

默认插槽:父里写,子里写来接受

具名插槽:里写属性=,子里写=

作用域插槽:携带数据用于中,父组件接受数据:-:名=""或者#名=""

14、脚手架的目录的文件夹和文件的作用?

放静态资源,放组件,放路由相关配置,.是应用主组件

.是入口文件。

祖孙组件传值:和

函数,数据。结构类似

:['']

3:

('',)

=('')

和服务端渲染

服务端生成解析内容发送到客户端、提高首屏渲染速度,提高。

以为例,主要依赖--为例,在控制器配置插件属性。

1、有哪些属性?

()、()、()、

:.$.

:方法参数为,.$.("方法名",参数)

:方法参数为,.$..计算属性名

:方法参数为,.$.()

-

1、两种模式是什么?区别、原理

:会显示#,回车刷新会加载到对应页面

原理:(标签触发锚点使值变化,浏览器事件监听值的变化,来改变页面内容,中有#)

:无#,回车刷新会404

原理:.和方法传参,添加历史记录而不会触发页面重新加载,中无#

2、怎么定义-的动态路由?怎么获取传过来的值

在目录下的.文件中,对属性加上/:。 使用对象的.

3、-的路由守卫有哪些?

全局:

前置守卫:((,,)=>{})

后置守卫:

路由内:

组件内:

作用:对于路由跳转进行拦截并操作。

4、如何配置404页面

5、路由跳转有哪些方式?

式:-  -

编程式:.

6、$ 和$有什么区别?

$:的总实例,;路由器对象,有很多属性和子对象。

$:当前的路由信息,只有、、、(当前路由信息参数)等属性。

3相比2发生了哪些变化?

1、响应式

2的响应式是基于.来监听数据对象的变化,但监听不到对象属性的增删、数组元素和长度的变化。(通过设置)

3采用了代理来代替,可以做到监听对象属性的增删和数组元素和长度的修改,还实现了惰性的监听。

2、组合式,2是

3用的是组合式,函数式编程,代码集中化,方便去梳理,组合式就是一个函数,组件的变量、方法、、、生命周期函数都在中

3、3函数式编程。和变成了函数形式

4、3体积更小,等属性,用到了才会打包。

3带来了好处?

1、性能提升,包括打包速度、内存占用、渲染速度

2、使用代替实现响应式

3、支持

4、组合式——都用引入,对渲染友好。方法和写在一起容易维护。可以单独封装复用。

如何实现

是采用数据劫持结合发布者-订阅者模式的方式实现的。

2通过.()来劫持各个属性的。

、在数据变动时发布消息给订阅者,触发相应的监听回调,对视图进行更新。实现一个监听器,用来劫持并监听所有属性,如果有变动,就通知给订阅者。实现一个订阅者,可以收到属性的变化通知并执行相应的更新函数,从而更新视图实现一个解析器,可以扫描和解析每个结点的相关指令,并初始化模板数据以及初始化相应的订阅器

组合式有哪些?有什么作用?

(定义响应式基本数据类型,取值)

(定义复杂数据类型)

(对象中的某个属性单独提供给外部使用时)

(可以批量创建多个 对象)

:监听特定的响应式引用或计算属性,接受两个参数,分别是监听数据和执行的回调

:直接接受一个回调函数,跟踪和监听任何变化

3生命周期函数有哪些

、、、、、、、

3新组件

1、

2组件必须有一个根标签,

3组件可以没有根标签,内部会将多个标签包含在一个虚拟元素中。

好处:减少标签层级,减小内存占用。

2、

是一种能够将我们的组件结构到指定位置的技术。

3、

处理异步组件,等待异步组件或者异步数据时。会出现一个加载指示。

什么是

是内容网络分发,根据用户位置请求最近的节点来请求对应网站的内容。

解决了跨地域访问资源的问题,降低延迟。提高访问速度

是什么?怎样使用它?

的是一种基于的异步请求库,安装 -- 即可使用,请求中包括,,, ,等五种请求方式。

+

(异步请求)

核心是的(->->->)

请求步骤:

1、创建对象  =

2、设置请求 .(‘方法’,‘路径’)

3、发送请求  .(参数)

4、监听成功后的响应数据。 .=(){(.==4&&.==200)}

(判断是否等于4,代表数据是否响应完成,)

获取:

请求

完全和和没关系,他是的升级版分,更加简洁易用。原生+

(,参数对象).(=>.())

参数对象:

{

:、

:{}请求头

:传参

}

预处理器——、的异同

和都是预处理器,他们可以进行变量赋值、混入、嵌套、运算、函数等。

区别:

定义赋值是用@,用的是$

性能优化的手段有哪些?

1、减少请求数量

图片处理——雪碧图(精灵图,定长宽+定位图片内容位置来“裁剪”)、字体图标、64代替图片。

不使用@ (会造成额外的请求)

避免使用空的和,如和

静态资源使用引入

图片懒加载

2、优化资源加载

服务器端渲染,内容在服务器生成,浏览器直接显示

尽可能将文件外链引入,文件写在底部,

使用或异步加载标签。

3、减少重绘回流

不使用布局

不要使用 代码对 元素设置多条样式,选择用一个 代替之。

定位使用或者脱离文档流。

代替 , ,-, -... 这些位移属性。

防抖与节流

4、打包优化

压缩代码

压缩代码

压缩图片、文件

防抖与节流

防抖:输入框实时搜索,定时器时间内不触发第二次。

解决:+判断

节流:窗口滚动,通过判断间隔时间来决定是否触发事件

正则表达式

常用限定符:

^:匹配字符串的起始位置

$:匹配字符串结束位置

?:匹配0或1次字符

:匹配0或多个字符

+:重复1次或多次

{2,6}:匹配2到6次之间

():匹配在一起的

:匹配或者

[-]:匹配所有单个小写字母

[-]+:匹配所有小写字母字符串

括的^:取反

元字符:

.:任意字符

:任意字母、数字、下划线、汉字。(取反,下同)

:任意空白符

:数字

七层模型

应用层

应用层:

表现层:

会话层:

之间:、

传输层

传输层:、

网络层

网络层:、

数据链路层

数据链路层

物理层

和有什么区别?

有证书(第三方机构的安全认证证书),一般没有,

默认端口是80,默认端口是443

是超文本传输协议,无状态协议,信息是明文传输,则是另外具有协议提供安全基础

协议:对称加密(加解密都是一个密钥)、非对称加密(一个公钥一个私钥。)

通常是两者结合的混合加密

1.0和2.0有什么区别?

主流是1.1连接

1.0一个一个请求,每次请求/响应结束后都会关闭连接,都要经历握手和挥手

1.1长连接,一个多个请求(但是要排队一个个进行,容易队头阻塞),

2.0多用复路和二进制分帧,不会互相影响:减少连接次数,解决了传输数据慢问题。

多路复用的方式消除队头阻塞的问题():客户端可以发送多个请求。

客户端的不同的请求分成多个帧,同一请求的帧的相同。

响应根据相同的帧合并为一条完整数据,同时按照优先级(例如>图片)

浏览器根据将数据给请求位置。

更多优化

1.1:添加新的请求方法,、。引入更多缓存头控制缓存

2.0:服务器可主动推资源给客户端。另外,请求文件时,一并响应回和

2.0:头部压缩,第一次发送所有头部字段,后续请求之发送差异数据。

和的区别?

请求时,表示要获取内容,不会修改服务器的数据。对数据类型和数据类型有限制,参数携带在上,会被缓存,服务器响应200。

请求时,表示要提交内容,会修改服务器的数据。数据长度和类型没有限制,参数写成对象,不会被缓存,更安全(因为参数不会被显示在且不会保存在浏览器历史)。(浏览器先发送,服务器响应100,再发送,服务器响应200。)

从输入到渲染的全过程从输入到页面渲染的整个过程 - 个人笔记_公孙元二的博客-博客_从输入到页面渲染全流程

输入了一个域名。

浏览器解析,提取的信息(协议、域名、端口、路径)

查询(先检查缓存有没有,没有则向操作系统查询,仍然没有就查询服务器)找到这个域名对应的服务器地址(),

通过请求建立链接服务(三次握手),

发送请求通过服务器()返回数据,

浏览器渲染,根据返回数据构建树、树,构建 进行布局和渲染,遇到下载并执行脚本。

关闭连接(四次挥手)。

常见的状态码有哪些?

100:响应继续

200:请求成功

301:网页被永久转移到气他

302:临时

304:未修改。(协商缓存,请求的网页没有变化)

400:客户端请求的语法错误。

401:需要用户的身份认证。

404:请求的网页不存在,找不到资源

500:内部服务器错误

504:超时

505:服务器不支持该版本。

三次握手(建立连接)、四次挥手(断开连接)

三次握手(在吗-在-好的)

客户端发送报文,= 给服务器

服务器发送和报文,=,并确认序列+1

客户端发送报文,=,并确认序列+1

为什么三次挥手:

为了客户端和服务器建立连接,但是网络有延迟,保证客户端未超时,防止客户端没有接收到数据。但是次数过多还会造成浪费。

四次挥手(我走了-好的+拜拜-拜拜)

客户端发送报文,=,并停止再发数据,关闭连接。

服务器发送报文,并确认+1

服务器发送报文,=

客户端发送报文,=+1

为什么:

确保数据完成发送、完整性,防止网络原因的防止错误关闭。

头部字段有哪些?

常见请求头:

:可接受的内容类型。

:-  长连接

-:表示发起访问的是什么浏览器,不写的话就判定爬虫,直接拒绝。

:用户登录信息。用户登录,服务器将登陆信息存储在客户端

:请求的来源点。

:请求的域名来源

常见响应头:

-:缓存机制,例如- 防止从缓存中获取过期资源

-:资源文件的类型

-:响应的大小

---:    允许跨域

---:允许访问的方法(??)

的。

写入,.=

如果写入,代表只能通过协议来访问,不能被脚本修改(上面那行),防止攻击,安全。

强缓存和协商缓存

(首次访问都会返回文件,不会考虑缓存)

都是对返回资源进行浏览器缓存

强缓存

响应头返回-

-=(),缓存的内容在该时间后失效。

- :对比文件,不变的话返回304(未修改)

-:彻底禁用缓存

:所有都被缓存(客户端+代理服务器)。

:只缓存客户端,不缓存在代理服务器。

协商缓存

(优先级高)——1.1

缓存过期时,若响应头有,则请求头带上--去服务器的标识对比,若文件相同返回304

- ——1.0

缓存过期(-)时,若响应头有-,则请求头带上--与-对比,对比的是修改时间。

和的区别

:面向连接(有三次握手四次挥手)、效率低、字节流、全双工(两个方向)可靠、文件传输、局域网(电话)

:面向无连接、效率高、报文、不可靠易丢包、视频、广域网()

风格

接口命名规范,资源/版本/执行的操作。/1/。

获取用,新增用,修改用,删除用。

响应体用格式返回。

双向实时通信,不需要客户端主动请求。

前提:

轮询:客户端定期发送请求的服务器

长轮询:客户端发送请求,保持连接打开,等待数据返回后停止。

优点:连接只需要建立初始的那一次。同时可以降低延迟请求更快。

过程:

首先发送一个常规的请求,请求头加上:

前端:

心跳机制:客户端和服务器直接通过心跳包(定期发送空数据)维持连接,防止长时间没有数据传输而断开。

限制:本身没有加密,需要加设安全措施。兼容性差,不支持老浏览器。较多消耗后端资源

解决跨域

跨域产生原因:同源策略拦截跨域

跨域:请求地址和当前地址的协议、域名、端口不同

浏览器允许发起跨域请求,也会返回数据,但是,返回的数据会被浏览器拦截,无法被页面获取到。

(前端解决跨域)

原理:通过标签的属性,请求跨域的接口,并通过?=回调函数接收接口响应的数据。 标签可以跨域加载外部脚本文件。

需要后端将数据传参给该回调函数。

缺点:只支持请求,不支持请求

(通过和,只需要请求中加:"")

(后端解决跨域)

是一个 3 标准,全称是"跨域资源共享",

解决跨域问题,就是在服务器端给响应添加头信息

5的,通过方法,用监听事件

代理服务器

常见的(版本管理)工作流程

初始化:

新增文件的命令:

将需要进行版本管理的文件放入暂存区域:

将暂存区域的文件提交到仓库:

管理的文件有三种状态:已修改(),已暂存(),已提交()

团队内部协作的流程

首先在上创建一个项目,然后为小组成员添加权限,给小组长搭好框架,把本地项目上传到远程项目 ,新建一个分支,所有成员都切换到分支中,在分支中进行,最后小组长将分支合并到分支上,并解决一些冲突。

冲突怎么解决

微信小程序原理

利用、、三种技术,本质是单页面,所有页面渲染和事件处理都是在一个页面内进行,但又可以调用各种微信提供的原生接口。

微信小程序的双向绑定和有什么不一样

小程序直接用.的属性是不可以同步到视图上的,必须调用接口明确指定同步哪些值到视图层才会触发。

是通过对数据对象使用-或者进行监听,只要属性值更改就会立即触发视图的更新。

和和正常的有哪些不同?

的尺寸单位是,是响应式像素,可以根据屏幕宽度自适应。

不支持:-、:,没有、等,不支持动画。

的、、等标签都成龙、。成了

微信小程序页面之间传递数据

1、在文件中定义全局变量,放入存储的信息。使用()拿到数据。

或者2、使用  与  的时候,可以将部分数据放在  里面,并在新页面  的时候初始化。

微信小程序的生命周期

()、()、()、()、()

如何实现下拉刷新

首先在全局  中的  配置 在  中定义  钩子函数,到达下拉刷新条件后,该钩子函数执行,发起请求方法请求返回后,调用  停止下拉刷新

和的区别是什么?

相同点:两者都是点击事件

区别:会阻止事件冒泡。

条件编译-的条件编译_与宇宙对视的博客-博客_ 条件编译

# - 写代码 #  :仅平台编译的代码

# 5 写代码 #  :除了5,其他平台都可编译出

# -5 写代码 #  :

获取地理位置的

.

如何监听页面滚动

事件

如何让图片宽度不变,高度自动变化,保持原图宽高比不变?

给标签添加=""

和原生相比的优缺点

用的是语法,小程序组件、标签和生命周期(小程序单页面),两者结合便于。有自己的和各种插件可以直接饮用,更加便捷支持、,原生不支持

的作用和工作原理

是打包工具,把一切都视为模块:不管是 、、 还是 都可以互相引用,通过定义 .,对所有依赖的文件进行跟踪,将各个模块通过 和 处理,然后打包在一起。

:,(生产环境会压缩代码)

打包过程

1、初始化:解析..配置文件,读取合并参数

2、加载模块:加载所有配置的插件

3、编译构建:从入口()开始,调用对模块进行编译,并根据递归找到依赖模块继续编译。得到编译模块和依赖关系。

4、输出:根据依赖关系,对编译后的组合成

5、写入文件:根据配置把文件内容写入文件系统。

?有哪些?

默认只能打包文件,配置里的的数组配置了一组规则,要有处理,告诉 在遇到哪些文件时使用哪些 去加载和转换打包成。去处理转换各种文件。

-,转换6到标准

-读取 合并 文件,

-把 内容注入到 里,

- 解析文件

-和-一样,处理图片或其他文件

?有哪些?

配置再里,是插件扩展器,解决无法实现的事,可以打包优化、资源管理,需要引入。

自动在打包结束后生成文件,并引入.

打包自动删除上次打包文件

:抽离压缩文件。

运行在打包文件之前,再整个编译周期都起作用。

什么是、什么是、什么是?

:是由打包出来的文件

:是指在进行模块依赖的时候,生成的中间文件,代表模块

:是中的单个模块

:之配置_的博客-博客_

用于过程中实时查看和调试应用。

多种配置

自动刷新

代理请求,避免跨域。

热更新。

热更新

不用每次都打包编译。自动实时更新效果。

:{:}

优化打包速度/性能优化

优化打包速度:

在一些较大的前面加上-,进行缓存

-,消除死代码,里,通过配置.为来启用 ,只包含使用的代码,减小体积。

插件:

减少不必要的插件的引入。

使用插件来压缩代码,减小体积。

使用插件压缩代码,减小体积。

引入插件,将一些文件(第三方库)进行打包成单独的文件,避免重新打包。

合理使用(会减慢速度)

来性能优化

包括以上打包速度优化,

使用 插件来生成 的模板时候,通过配置属性优化

图片压缩

压缩,里配置:{:,:80}

压缩,配置:{:}

压缩,:{:80}

为了保证报错的行数和源代码的行数保持一致

在同级别写 :‘--’

生产环境下要省略选项,防止原始代码通过 的形式暴露给用户。

最佳实践:    环境():设置:‘--’’

生产环境()  :设置:‘--’

和的区别和比较,还有

两者都是现代化打包工具

打包方式:

:各模块之间依赖→编译打包→服务器渲染出打包结果。问题:模块增多,体积大,热更新速度慢。:启动服务器=》按需动态编译模块显示(请求某个模块时再对该模块进行实时编译)。:更轻量级,专注于库的打包,更快,优化体积,内置-去除未使用代码

优点:

打包快,因为启动时不需要打包,不懂编译默认支持热更新,热更新也更快,因为按需编译。

但是生态没有完善

和的区别,为什么要使用,好处是什么?

难以维护,没有泛型、接口、枚举等工具,不利于大型项目。所有有效的 代码都是有效的 代码,将 . 文件重命名为 . 不会改变任何内容。

原因:因为写的代码很多如果不运行,就会有很多语法错误。类型控制,让编译的时候就能发现并避免错误。而且有类型定义、接口规范,使代码结构更清晰,和保持一致性。

重要语法

有三种原始数据类型,、、

定义变量:拥有多个类型: : ,任意类型 :

定义数组: :[]=[1,23,3,4]      :[]=[1,2,""](约束数组的参数)

定义函数:可以结合接口进行数据类型限制,

和:都是任意类型,但彻底放弃类型检查,的变量实例只能赋值给和的变量。

和:表示函数返回值为空(和),代表不会有返回值

元组(,类似列表): 1:[,?,];1=["",3]

枚举(,各种情况的语义化),互相映射,可以做常量:

类(对象携带属性和方法):数据结合带上数据类型写。继承。,(类和子类可以访问)、修饰符属性

泛型: 一个代理的泛称,代码更加灵活,

接口: 用于对对象的形状进行描述(一种事先约束)。

(可选属性加?。任意属性[:]:表示属性名和属性值都是任意类型)

自定义类型: 类型名=类型内容。

数组和元组有什么区别

数组可以有多个类型,但元组虽然有不同类型,但类型和顺序是固定的。

数组可以变化、增删改。但元组长度固定,数量不可变,

数组定义 :[]=[1,2],元组定义: :[,]=[1,'2']

对类型断言的理解

两种写法:尖括语法和语法

它可以让我们在编译时指定变量的类型,以便在运行时避免出现类型错误

的和的区别

对类型的定义。

主要定义对象的结构和规范,支持接口合并、接口继承和扩展,可以被类实现。

只是给类型起别名。可以描述多种类型,包括对象、联合类型、交叉类型等。

关键字,控制成员可见性的方法

关键字

:都能访问

:受保护。自己和子类可访问

:私有,只有自己能访问

抽象类

关键字进行。抽象类可以包含抽象方法、普通方法和属性

不能直接实例化,只能被继承。可以包含抽象方法、普通方法和属性。抽象方法必须在派生类中实现。

前端网络安全

攻击:跨站请求伪造

过程:用户登录漏洞网站(恶意网站)时,攻击者盗用身份信息(等),以此名义发送进行恶意操作(危险服务器携带模拟用户请求接口)

防范:

1、验证 字段,可知请求来源,来拒绝未知的跨域请求

2、添加(客户端令牌)验证:第一次登录后,服务器生成一个给客户端,客户以后带上请求数据。(如果客户端带的和服务器的不一致,则拒绝请求)

3、验证码,类似2

攻击:跨站脚本攻击

过程:用户通过表单提交一段脚本给服务器,服务器处理后会影响网页,形成漏洞

危害:网页布局和运行受影响、被盗取、恶意跳转

防范:

1、浏览器有筛选器

2、对输入的、、标签进行过滤

3、对符进行转换编码。

4、写入

点击劫持攻击

过程:用户点击一些“虚伪”链接或按钮,但其实链接上方有一个通过-设置的“透明”的小组件,例如可以是“点赞”按钮或链接,以达到网站非法目的。

防范:

1、服务器添加--响应头

2、判断.和.是否一致,不一致不允许操作(也可以用作防止其他网站嵌套自己的)

注入

输入里插入代码,操作数据库。

设计模式

设计模式:对软件设计过程中反复出现的某类问题的通用解决方案,框架底层设计。

工厂模式

简单工厂模式:

写多个小产品类(方法),在大工厂类中通过实例在判断逻辑中选择具体产品类。

优点:因此客户端只需要知道具体参数即可。

缺点:增加了系统的复杂度和理解难度,一旦增加新产品就不得不修改逻辑。

单例模式

单例模式:

定义且只使用一个实例。

指的是创建的总是同一个实例,使用类创建的实例始终是相同的。唯一性

需要使用,每次的是同一个对象

外观模式

外观模式:

解决兼容性问题

适配器模式

适配器模式:

调节使用(转换器),对格式或者接口进行转换。

发布订阅模式(观察者模式)(村长通知村民)

观察者模式:例如订阅主播,会有内容更新的推送。当观察对象状态改变时,通过调用观察者的某个方法将这些变化通知到观察者。

观察者模式所做的工作就是在解耦,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。

策略模式:会员折扣机制。存储。通过匹配执行任务

代理模式:,代理操作。+

和2的区别

前者通过回调函数的方式处理异步,后者是通过/的方式处理处理异步

前者的中间件是线性模型(一个接一个),后者是洋葱模型()

前者自带和,后者需要安装

的使用

的模块

文件的读写,常用方法:读取,写入,拷贝,创建目录

读取:.,默认读成,异步读取.

写入:.,异步写入同理如下

追加写入:

拷贝:

创建目录:

什么是路由?中如何管理路由

路由是服务器中,对用户的请求进行分发,交给对应的业务处理函数进行业务受理的一种操作模式。的路由为了将代码逻辑更加清晰。

中包含了入口模块中的主路由(),以及模块化拆分后的子路由对象.(),创建的子路由对象使用固定语法()函数完成子路由的注册和使用。

使用:放一起的用./.正常写,在路由里面引入并用.()传参引入

什么是中间件,中有哪些不同的中间件

中间件是工作在客户端和服务器之间的中间组件,主要用于拦截请求和响应,对请求和响应进行功能扩展的中间组件。

主要包含三种中间件,分别是内置中间件、第三方中间件以及自定义中间件。

© 版权声明
THE END
分享