又到一年的毕业季了,大家都找到心仪的工作了吗?小牛马特此整理了百道前端面试基础题,对想要成为前端开发工程师的你一定很有帮助!
两套前端开发工程师简历模板。
链接:https://pan.baidu.com/s/1CmFN9IdGOi7_PQahELa4xw
提取码:LDL6
1. 网络中使用最多的图片格式有哪些
JPEG,GIF,PNG,最流行的是 jpeg 格式,可以把文件压缩到最小 在 ps 以 jpeg 格式存储时,提供 11 级压缩级别 。
2.请简述 css 盒子模型
一个 css 盒子从外到内可以分成四个部分:margin
(外边距),border
(边框),padding
(内边距),content
(内容)
默认情况下,盒子的 width 和 height 属性只是设置 content(内容)的宽和高 。
盒子真正的宽
应该是:内容宽度+左右填充+左右边距+左右边框
盒子真正的高
应该是:内容高度+上下填充+上下边距+上下边框
3.视频/音频标签的使用
视频:
视频标签属性:
属性名称 | 作用 |
---|---|
src | 需要播放的视频地址 |
width/height | 设置播放视频的宽高,和 img 标签的宽高属性一样autoplay 是否自动播放 |
controls | 是否显示控制条 |
poster | 没有播放之前显示的展位图片loop 是否循环播放 |
perload | 预加载视频(缓存)与 autoplay 相冲突,设置了 autoplay 属性,perload属性会失效。 |
muted | 静音模式 |
音频: 音频属性和视频属性差不多,不过宽高和 poster
属性不能用
<audio>
<source src=”” type=””>
audio>
4.HTML5 新增的内容有哪些
- 新增语义化标签
- 新增表单类型
- 表单元素
- 表单属性
- 表单事件
- 多媒体标签
5.Html5 新增的语义化标签有哪些
语义化标签优点:
1.提升可访问性
2.seo
3.结构清晰,利于维护
标签名称 | |
---|---|
header | 页面头部 |
main | 页面主要内 |
footer | 页面底部 |
nav | 导航栏 |
aside | 侧边栏 |
article | 加载页面一块独立内容 |
section | 相当于 div |
figure | 加载独立内容(上图下字) |
figcaption | figure 的标题 |
Hgroup | 标题组合标签 |
mark | 高亮显示 |
dialog | 加载对话框标签(必须配合 open 属性) |
Embed | 加载插件的标签 |
video | 加载视频 |
audio | 加载音频(支持格式 ogg,mp3,wav) |
6.Css3 新增的特性
边框:
- border-radius 添加圆角边框
- border-shadow:给框添加阴影 (水平位移,垂直位移,模糊半径,阴
影尺寸,阴影颜色,insetr(内/外部阴影))- border-image:设置边框图像
- border-image-source 边框图片的路径
- border-image-slice 图片边框向内偏移
- border-image-width 图片边框的宽度
- border-image-outset 边框图像区域超出边框的量
- border-image-repeat 图像边框是否平铺(repeat 平铺 round 铺满
stretch 拉伸)
背景:
- Background-size 背景图片尺寸
- Background-origin 规定 background-position 属性相对于什么位置定
位- Background-clip 规定背景的绘制区域(padding-box,border-box,
content-box)
渐变:
- Linear-gradient()线性渐变
- Radial-gradient()径向渐变
文本效果:
- Word-break:定义如何换行
- Word-wrap:允许长的内容可以自动换行
- Text-overflow:指定当文本溢出包含它的元素,应该干啥
- Text-shadow:文字阴影(水平位移,垂直位移,模糊半径,阴影颜
色)
转换:
- Transform 应用于 2D3D 转换,可以将元素旋转,缩放,移动,倾斜
- Transform-origin 可以更改元素转换的位置,(改变 xyz 轴)
- Transform-style 指定嵌套元素怎么样在三位空间中呈现
- 2D 转换方法:rotate 旋转 translate(x,y)指定元素在二维空间的位移
- scale(n)定义缩放转换
- 3D 转换方法:Perspective(n)为 3D 转换 translate rotate scale
过渡:
- Transition-property 过渡属性名
- Transition-duration 完成过渡效果需要花费的时间
- Transition-timing-function 指定切换效果的速度
- Transition-delay 指定什么时候开始切换效果
动画:animation
- animation-name 为@keyframes 动画名称
- animation-duration 动画需要花费的时间
- animation-timing-function 动画如何完成一个周期
- animation-delay 动画启动前的延迟间隔
- animation-iteration-count 动画播放次数
- animation-direction 是否轮流反向播放动画
7.清除浮动的方式有哪些?请说出各自的优点
高度塌陷:
当所有的子元素浮动的时候,且父元素没有设置高度,这时候父元素就会产生高度塌陷。
清除浮动方式
1:给父元素单独定义高度
优点
:快速简单,代码少
缺点
:无法进行响应式布局
2:父级定义
overflow:hidden;zoom:1
(针对 ie6 的兼容)
优点
:简单快速、代码少,兼容性较高
缺点
:超出部分被隐藏,布局时要注意
3:在浮动元素后面加一个空标签,clear:both;height:0;overflow:hidden
优点
:简单快速、代码少,兼容性较高。
缺点
:增加空标签,不利于页面优化
4:父级定义
overflow:auto
优点
:简单,代码少,兼容性好
缺点
:内部宽高超过父级 div 时,会出现滚动条
5:万能清除法:
给塌陷的元素添加伪对象
.father:after{
Content:“随便写”;
Clear:both;
display:block;
Height:0;
Overflow:hidden;
Visibility:hidden
}
优点
:写法固定,兼容性高
缺点
:代码多
8.定位的属性值有何区别
Position 属性值:relative
absolute
fixed
static
sticy
- Relative 相对定位 不脱离文档流,相对于自身定位
- Absolute 绝对定位,脱离文档流 相对于父级定位
- Fixed 固定定位,脱离文档流,相对于浏览器窗口定位
- sticy 粘性定位,常做吸顶使用
- Static 默认值,元素出现在正常的流中
9.子元素如何在父元素中居中
水平居中:
- 子父元素宽度固定,子元素设置 margin:auto,并且子元素不能设置浮动,否则居中失效
- 子父元素宽度固定,父元素设置 text-align:center,子元素设置 display:inline-block,并且子元素不能设置浮动,否则居中失效
水平垂直居中:
- 子元素相对于父元素绝对定位,子元素 top,left 设置 50%,子元素 margin-top和 margin-left 减去各自宽高的一半
- 子元素相对于父元素绝对定位,子元素上下左右全为 0,然后设置子元素margin:auto
- 父元素设置 display:table-cell vertical-align:middle,子元素设置margin:auto(多行文本垂直居中)
- 子元素相对父元素绝对定位,子元素 top,left 值为 50%,transform:translate(-50%,-50%)
- 父元素设置弹性盒子,
display:flex; justfy-content:center ;align-item:center;
10.Border-box 与 content-box 的区别?
11.如何让元素垂直居中?
12.如何让 chrome 浏览器显示小于 12px 的文字?
本来:添加谷歌私有属性 -webkit-text-size-adjust:none,
现在:-webkit-transform:scale()
13.Css 选择器有哪些,那些属性可以继承,优先级如何计算?Css3 新增的伪类有哪些?
结构伪类选择器:
- 查找第几个: nth-child(n)
- 查找同一类型第几个: nth-of-type
- 查找唯一类型: only-of-type
属性选择器:根据标签属性查找 [attr=value]
: root
查找根元素 html 标签: empty
查空标签
目标伪类选择器:(表单)
:enabled
查找可以使用的标签:disabled
查找禁止使用的标签:checked
查找被选中的标签
伪元素选择器 :
:selection
设置选中文本内容的高亮显示(只能用于背景色和文本颜色)
否定伪类选择器 not()
语言伪类选择器 lang(取值)
优先级(权重):
- 元素选择器 1
- 伪元素选择器 1
- class 选择器 10
- 伪类选择器 10
- 属性选择器 10
- Id 选择器 100
- 内联样式的权重 1000
- 包含选择器权重为权重之和
- 继承样式权重为 0
那些属性可以继承:
- Css 继承特性主要是文本方面
- 所有元素可继承:
visibility
和cursor
- 块级元素可继承:
text-indent
和text-align
- 列表元素可继承:list-style,list-style-type,list-style-position,list-style-imag
- 内联元素可继承:letter-spacing,word-spacing,line-height,color,font,font-family,font-size,font-style,font-variant,font-weight,text-decoration,text-transform,
direction- 字母间距 段落间距 行高 字体颜色 字体种类 字体大小 字体样式 字体粗
细 小型大写字母文本 文本修饰 转换不同元素中的文本 文本方向
14.网页中有大量图片加载很慢 你有什么办法进行优化?
csssprite
或者 svgsprite
15.行内元素/块级元素有哪些?
16.浏览器的标准模式和怪异模式区别?
区别:
- 在怪异模式下,盒模型为怪异盒模型 而在标准模式下为标准盒子模型
- 图片元素的垂直对齐方式 对于行内元素和 table-cell 元素,标准模式下vertical-align 属性默认值是 baseline,而在怪异模式下,table 单元格中的。
- 图片的 vertical-align 属性默认值是 bottom,因此在图片底部会有几像素的空间
- 元素中的字体 css 中 font 的属性都是可以继承的,怪异模式下,对于table 元素,字体的某些元素不能从其他封装元素继承中得到,特别是 font-size。
- 属性:
- 内联元素的尺寸 标准模式下,non-replaced inline 元素无法自定义大写,怪异模式下,定义元素的宽高会影响元素的尺寸。
- 元素的百分比高度 当一个元素使用百分比高度时,在标准模式下,高度取决于内容变化,在怪异模式下,百分比被准确应用元素溢出的处理 标准模式下,overflow 取值默认值为 visible,在怪异模式下,这个溢出会被当做扩展 box 对待,就是元素的大小由内容决定,溢出不会裁剪,元素框自动调整,包含溢出内容。
17.Margin 和 padding 在什么场合下使用
18.弹性盒子布局属性有那些请简述?
flex-direction:弹性容器中子元素排列方式(主轴排列方式)
flex-wrap:设置弹性盒子的子元素超出父容器时是否换行
flex-flow:是 flex-direction 和 flex-wrap 简写形式
align-item:设置弹性盒子元素在侧轴上的对齐方式
align-content:设置行对齐
justify-content:设置弹性盒子元素在主轴上的对齐方式
19.怎么实现标签的禁用
添加 disabled 属性
20.flex 布局原理
就是通过给父盒子添加 flex 属性,来控制子盒子的位置和排列方式
21.px,rem,em 的区别
px 实际上就是像素,用 PX 设置字体大小时,比较稳定和精确。
px 像素(Pixel)。相对长度单位。像素 px 是相对于显示器屏幕分辨率而言的。
px 特点:
IE 无法调整那些使用 px 作为单位的字体大小;
国外的大部分网站能够调整的原因在于其使用了 em 或 rem 作为字体单位;
Firefox 能够调整 px 和 em,rem,但是有大部分的国产浏览器使用 IE 内核。
em 是相对长度单位。
相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。(引自 CSS2.0 手册)
任意浏览器的默认字体高都是 16px。所有未经调整的浏览器都符合: 1em=16px。
那么 12px=0.75em,10px=0.625em。为了简化 font-size 的换算,需要在 css 中
的 body 选择器中声明 Font-size=62.5%,这就使 em 值变为 16px*62.5%=10px,
这样 12px=1.2em, 10px=1em, 也就是说只需要将你的原来的 px 数值除以 10,然
后换上 em 作为单位就行了。1em=1rem=16px 在 body 中加入 font-size:62.5% 这
样直接就是原来的 px 数值除以 10 加上 em 就可以
em 特点
- em 的值并不是固定的;
- em 会继承父级元素的字体大小。
rem 是 CSS3 新增的一个相对单位(root em,根 em),使用 rem 为元素设定字体
大小时,相对的是 HTML 根元素。
px 与 rem 的选择?
对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用 px 即可 。
对于需要适配各种移动设备,使用 rem,例如只需要适配 iPhone 和 iPad 等分辨
率差别比较挺大的设备。
22.网页的三层结构有哪些
结构(html 或 xhtm 标记语言)
表现(css 样式表)
行为(js)
23.请简述媒体查询
媒体查询扩展了 media 属性, 就是根据不同的媒体类型设置不同的 css 样式,达到自适应的目的。
24.rem 缺点
比如:小说网站,屏幕越小的移动设备如果用了 rem 肯定文字就越小,就会导致看文章的时候特别费眼
25.常见的兼容性一阶段内容中记几个
26.垂直与水平居中的方式
line-height,text-align
27.三栏布局方式两边固定中间自适应
28.Doctype 作用
声明文档类型
29.元素类型分为哪几种?特点分别是什么?
一、块状元素 block 就是之前总结的大标签类型
特点:
1.独占一行或者一块区域,竖着排列的;
2.可以添加宽高;
3.可以添加 margin 和 padding,并且上下左右都生效;
4.一般可以作为其他元素的父元素使用
二、行内元素(内联元素) inline 之前总结的小标签
特点:
1.默认情况下,都是挨着排列的,并且有默认间距;
2.默认请况下,宽高添加无效;
3.默认情况下,添加的 margin 和 padding 值,只有左右生效,上下不生效;
三、行内块元素 inline-block 之前总结的特殊标签
特点:
1.就是块元素和行内元素特点的结合
2.有自己的私有属性 vertical-align:top/middle/bottom;
作用:
(1)可以用来解决图片向下撑大 3px 的 bug;
(2)可以结合其他属性一起实现行内块元素做水平垂直居中;
30.让一个元素消失和出现的方法是什么?
2 种情况使用:
- 需要鼠标滑过的时候有过渡效果,鼠标移开的时候没有过渡效果;transition
写在 hover 的地方;- 需要鼠标滑过的时候和鼠标移开的都有过渡效果;transition 写在元素的本
身
visibility: hidden
visibility: visible; 占据空间,可以点击
31.子元素使用 margin-top,会导致父元素出现下移,请问怎么解决?
32.图片向下撑大 3 像素的 bug 有哪些解决方案?
5. 给图片添加 vertical-align: top/middle/bottom;
6. 给图片添加 display:block;
7. 给图片或者图片的父元素添加 float:left;
8. 给 body 或者图片的父元素添加 font-size:0;
1.Js 基本数据类型有哪些
字符串 String
数值 Number
布尔 boolean
null
undefined
对象 数组
typeof 判断数据类型
2.Ajax 如何使用
一个完整的 AJAX 请求包括五个步骤:
type
请求的方式 (get | post)url
请求地址async
是否异步 (默认 true)3.如何判断一个数据是 NaN
4.Js 中 null 与 undefined 区别
5.闭包是什么?有什么特性?对页面会有什么影响
闭包可以简单理解成:定义在一个函数内部的函数。其中一个内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
特点:
使用:
优点:
缺点:会造成内存泄露
闭包的使用场景
setTimeout
原生的 setTimeout 传递的第一个函数不能带参数,通过闭包可以实现传参效果。
回调
定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。
函数防抖
在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。实现的关键就在于 setTimeOut
这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。
6.Js 中常见的内存泄漏:
7.事件委托是什么?如何确定事件源(Event.target 谁调用谁就是事件源)
JS 高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事件。
事件委托,称事件代理,是 js 中很常用的绑定事件的技巧,事件委托就是把原本需要绑定在子元素的响应事件委托给父元素,让父元素担当事件监听的职务。
事件委托的原理是 DOM 元素的事件冒泡
8.什么是事件冒泡?
一个事件触发后,会在子元素和父元素之间传播,这种传播分为三个阶段:
9.本地存储与 cookie 的区别
Cookie 是小甜饼的意思。顾名思义,cookie 确实非常小,它的大小限制为 4KB左右。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。
localStorage
是 HTML5 标准中新加入的技术,它并不是什么划时代的新东西。
早在 IE 6 时代,就有一个叫 userData 的东西用于本地存储,而当时考虑到浏览器兼容性,更通用的方案是使用 Flash。而如今localStorage 被大多数浏览器所支持,如果你的网站需要支持 IE6+,那以 userData 作为你方案是种不错的选择。
sessionStorage
与 localStorage 的接口类似,但保存数据的生命周期与
localStorage
不同。做过后端开发的同学应该知道 Session 这个词的意思,直译过来是“会话”。而 sessionStorage 是一个前端的概念,它只是可以将一部分数据在当前会话中保存下来,刷新页面数据依旧存在。但当页面关闭后,sessionStorage 中的数据就会被清空。
Cookie
一般由服务器生成,可设置失效时间。如果在浏览器端生成 Cookie,默认是关闭浏览器后失效,4K 左右
localStorage 除非被清除,否则永久保存,一般为 5MB
sessionStorage
仅在当前会话下有效,关闭页面或浏览器后被清除。
与服务器端通信
每次都会携带在 HTTP 头中,如果使用 cookie 保存过多数据会带来性能问题
仅在客户端(即浏览器)中保存,不参与和服务器的通信。
易用性
需要程序员自己封装,源生的 Cookie 接口不友好。
源生接口可以接受,亦可再次封装来对 Object 和 Array 有更好的支持。
10.ES6 新特性
const 和 let、模板字符串、箭头函数、函数的参数默认值、对象和数组解构、for…of 和 for…in、ES6 中的类。
11.Let 与 var 与 const 的区别
12.数组方法有哪些请简述
13.Json 如何新增/删除键值对
//添加
json["gender"]="男"
json["age"]=26;
alert(json.age);
//删除
delete json["age"];
alert(json.age);
alert(json.gender);
14.什么是面向对象请简述
15.普通函数和构造函数的区别
16.请简述原型/原型链/(原型)继承*****
什么是原型:
任何对象实例都有一个原型,也叫原型对象,这个原型对象由对象的内置属
性_proto_指向它的构造函数的 prototype 指向的对象,即任何对象都是由一个
构造函数创建的,但是不是每一个对象都有 prototype,只有方法才有prototype。
什么是原型链?
原型链基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
我们知道,每个构造函数都有一个原型对象,每个原型对象都有一个指向构造函数的指针,而实例又包涵一个指向原型对象的内部指针。
原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性时,就
一层层的扒出创建对象的构造函数,直至到 Object 时,就没有_proto_指向了。
因为_proto_实质找的是 prototype,所以我们只要找这个链条上的构造函数的
prototype。其中 Object.prototype 是没有_proto_属性的,它==null。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数想指针
(constructor),而实例对象都包含一个指向原型对象的内部指针(__proto__
)。
如果让原型对象等于另一个原型对象的实例,此时的原型对象将包含一个指向另
一个原型的指针(__proto__
),另一个原型也包含着一个指向另一个构造函数的指针(constructor
)。假如另一个原型又是另一个类型的实例……这就构成了实
例与原型的链条。也叫原型链.
原型继承是 js 的一种继承方式,原型链作为实现继承的主要方法,其基本思路是
利用原型让一个引用类型继承另一个引用类型的属性和方法,
原型继承:利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继
承,这种实现继承的方式,就叫做原型继承.
17.Promise 的理解
一、什么是 Promise?我们用 Promise 来解决什么问题?
我们都知道,Promise 是承诺的意思,承诺它过一段时间会给你一个结果。
Promise 是一种解决异步编程的方案,相比回调函数和事件更合理和更强大。
从语法上讲,promise 是一个对象,从它可以获取异步操作的消息;
二、promise 有三种状态:pending 初始状态也叫等待状态,fulfiled 成功状态,
rejected 失败状态;状态一旦改变,就不会再变。创造 promise 实例后,它会
立即执行。
三、Promise 的两个特点
1、Promise 对象的状态不受外界影响
2、Promise 的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状
态不可以逆。
四、Promise 的三个缺点
1)无法取消 Promise,一旦新建它就会立即执行,无法中途取消
2)如果不设置回调函数,Promise 内部抛出的错误,不会反映到外部
3)当处于 pending(等待)状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
18.promise 是用来解决两个问题的:
19.请简述 async 的用法
Async 就是 generation 和 promise 的语法糖,async 就是将 generator 的*换成
async,将 yiled 换成 await函数前必须加一个 async,异步操作方法前加一个 await 关键字,意思就是等一下,执行完了再继续走,注意:await 只能在 async 函数中运行,否则会报错
Promise 如果返回的是一个错误的结果,如果没有做异常处理,就会报错,所以用 try…catch 捕获一下异常就可以了
20.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
分为 4 个步骤:
21.Css 预处理 sass less 是什么?为什么使用他们
Sass 和 less 都是 css 预处理器,是 css 上的一种抽象层,是一种特殊的语法,
最终会编译成 css,less 是一种动态样式语言,给 css 赋予了动态语言的特性,比如:变量,继承,嵌套。Less 既可以在客户端运行,在可以在服务端运行(需要借助 node)
22.Js 中.call()与.apply()区别
apply:调用一个对象的一个方法,用另一个对象替换当前对象。
call:调用一个对象的一个方法,用另一个对象替换当前对象。
从定义中可以看出,call 和 apply 都是调用一个对象的一个方法,用另一个对象替换当前对象。而不同之处在于传递的参数,apply 最多只能有两个参数——新 this 对象和一个数组 argArray,如果 arg 不是数组则会报错
相同点:两个方法产生的作用是完全一样的。call, apply 作用就是借用别人的方法来调用,就像调用自己的一样.
不同点:方法传递的参数不同
23.为什么会造成跨域/请简述同源策略
出现跨域问题的原因:
- 在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问问题。
在请求的过程中我们要想回去数据一般都是 post/get 请求,所以…跨域问题出
现- 跨域问题来源于 JavaScript 的同源策略,即只有 协议+主机名+端口号(如存在)
相同,则允许相互访问。也就是说 JavaScript 只能访问和操作自己域下的资源,
不能访问和操作其他域下的资源。
同源策略 是由 NetScape 提出的一个著名的安全策略。所谓的同源,指的是协议,
域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不
同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。
24.请输出三种减少页面加载时间的方式
当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图
片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了)
减少 http 请求(合并文件,合并图片)
25.This 指向
在 JavaScript 中,this 通常指向的是我们正在执行的函数本身,或者是,指向
该函数所属的对象。
全局的 this → 指向的是 Window
对象中的 this → 指向其本身
事件中 this → 指向事件对象
26.什么是 jsonp 工作原理是什么?
Jsonp 其实就是一个跨域解决方案。
Js 跨域请求数据是不可以的,但是 js 跨域请求 js 脚本是可以的。
所以可以把要请求的数据封装成一个 js 语句,做一个方法的调用。
跨域请求 js 脚本可以得到此脚本。得到 js 脚本之后会立即执行。
可以把数据做为参数传递到方法中。就可以获得数据。从而解决跨域问题。
jsonp 原理:(动态创建 script 标签,回调函数)
浏览器在 js 请求中,是允许通过 script 标签的 src 跨域请求,可以在请求的结
果中添加回调方法名,在请求页面中定义方法,就可获取到跨域请求的数据。
27.jsonp 为什么不是真正的 ajax?
标签来调用服务器提供的 js 脚本。28.请掌握 2 种以上数组去重的方式
1.双层循环(暴力方法)
3.排序去重
5.键值对(key-value)
29.深浅拷贝是什么如何实现?
30.为什么 js 是弱类型语言
弱类型语言实现相对于强类型语言来说的,在强类型语言中,变量类型有多种,
比如 int char float Boolean 不同类型相互转换有时需要强制转换,而jacascript 只有一种类型 var,为变量赋值时会自动判断类型并转换,所以是弱类型语言。
31.怎么转换 less 为 css
用 node 将 less 文件生成为 css 文件
32.用 webstorm 自动生成
33.echarts 使用最多的是什么
图表及图表组合
34.For 循环与 map 循环有什么区别
35.请写出一个简单的类与继承
创建类有三种:
- 使用 function 和 this 关键字
- 原型方法 用 prototype 和 this 关键字
- 使用 object.create()方法构造
继承有六种:
- 原型继承
- 借用构造函数继承
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承
36.同步与异步的区别/阻塞与非阻塞区别
同步(阻塞的)
异步(非阻塞)
同步(阻塞)异步(非阻塞)这两个关注的是程序在等待调用结果时的状态
37.重绘和回流是什么
38.http 是什么?有什么特点
http 叫做超文本传输协议,是互联网应用最广泛的一种网络协议
特点:基于请求-响应的模式 无状态保存 无连接
39.HTTP 协议和 HTTPS 区别
40.原型和继承,prototype,call 和 apply 继承的区别(第一个参数是相同的,
第二个的区别在哪)
41.箭头函数与普通函数的区别
42.什么是 js 内存泄露?
内存泄漏是指一块被分配的内存既不能使用又不能回收,直到浏览器进程结束
释放内存的方法:赋值为 null
你如何对网站的文件和资源进行优化?
1、文件合并(目的是减少 http 请求)
2、文件压缩(目的是直接减少文件下载的体积)
3、使用 cdn 托管资源
4、使用缓存
5、gizp 压缩你的 js 和 css 文件
6、meta 标签优化(title,description,keywords)、heading 标签的优化、alt优化
7、反向链接,网站外链接优化
43.请简述 ajax 的执行过程 以及常见的 HTTP 状态码
各类别常见状态码:
- 200 OK:表示从客户端发送给服务器的请求被正常处理并返回;
- 204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回);
- 206 Patial Content:表示客户端进行了范围请求,并且服务器成功执行了这部
分的 GET 请求,响应报文中包含由 Content-Range 指定范围的实体内容。- 301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的 URL,
之后应使用更改的 URL;- 302 Found:临时性重定向,表示请求的资源被分配了新的 URL,希望本次访问使用新的 URL;
- 301 与 302 的区别:前者是永久移动,后者是临时移动(之后可能还会更改 URL)
- 303 See Other:表示请求的资源被分配了新的 URL,应使用 GET 方法定向获取
请求的资源;- 302 与 303 的区别:后者明确表示客户端应当采用 GET 方式获取资源
- 304 Not Modified:表示客户端发送附带条件(是指采用 GET 方法的请求报文中
包含 if-Match、If-Modified-Since、If-None-Match、If-Range、
If-Unmodified-Since 中任一首部)的请求时,服务器端允许访问资源,但是请
求为满足条件的情况下返回改状态码;- 307 Temporary Redirect:临时重定向,与 303 有着相同的含义,307 会遵照浏
览器标准不会从 POST 变成 GET;(不同浏览器可能会出现不同的情况);- 400 Bad Request:表示请求报文中存在语法错误;
- 401 Unauthorized:未经许可,需要通过 HTTP 认证;
- 403 Forbidden:服务器拒绝该次访问(访问权限出现问题)
- 404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
- 500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是
web 应用存在的 bug 或某些临时的错误时;- 503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求
44.null 和 undefined 的区别?
45.闭包的使用场景?
由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,闭包
就是能够读取其他函数内部变量的函数。所以,在本质上,闭包就是将函数内部
和函数外部连接起来的一座桥梁。
闭包的使用场景
46.预加载和懒加载的区别,预加载在什么时间加载合适
预加载是指在页面加载完成之前,提前将所需资源下载,之后使用的时候从缓存中调用;懒加载是延迟加载,按照一定的条件或者需求等到满足条件的时候再加载对应的资源
两者主要区别是一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端
有一定的缓解压力作用,预加载则会增加服务器前端压力。
47.网页中有大量图片加载很慢 你有什么办法进行优化?
48.foreach 和 map 的区别?
答:
49.判断数据类型的方法?
typeof 可以判断数据类型,它返回表示数据类型的字符串(返回结果只能包括
number,boolean,string,function,object,undefined);
instanceof 原理 因为 A instanceof B 可以判断 A 是不是 B 的实例,返回一个布尔值,由构造类型判断出数据类型
50.Post 和 get 的区别
51.什么是进程,什么是线程
52.什么是优雅降级,什么是渐进增强
53.什么是宿主对象,什么内置对象,什么是本地对象?
54.什么是防抖,什么是节流
55.什么 TCB,UDP
56.什么是长连接,什么是短连接,什么是轮询?
57.什么是浏览器的预检请求?
当你请求浏览器的时候,服务器会试探请求一下,如果跨域会报 204 错误在 CORS 机制中,客户端将请求分为了两种:简单请求和非简单请求;当请求为非简单请求时,就会触发浏览器发送预检请求,这是浏览器的行为。
预检请求会向服务器确认跨域是否允许,服务返回的响应头里有对应字段
Access-Control-Allow-Origin 来给浏览器判断:如果允许,浏览器紧接着发送实际请求;不允许,报错并禁止客户端脚本读取响应相关的任何东西。
所以,一个 POST 请求并且请求头添加了 Content-Type: application/json ,浏览器判定为非
简单请求,自己先发一个 OPTIONS 给服务器获取做跨域判定,获取响应后浏览器发现可以
跨域,接着就发送真实的 POST。
这里就解答两个问题了,接下来就是为什么预检请求选择了 OPTIONS 呢?
来看预检请求的流程,如果是一个跨域请求,浏览器会自动给该请求带上 Origin 头部,标
明当前请求的来源域;服务器判断这个请求是否允许跨域,就会在返回时,选择是否带上
Access-Control-Allow-Origin 头部,最后,浏览器判断 Access-Control-Allow-Origin 就知道,
后续请求是否发送。
这个流程中,对预检请求方法的要求:
(1)不需要带请求体,服务器判断的依据在 Request header 中;
(2)服务器返回不需要响应体,浏览器判断的依据在 Response header 中;
(3)请求不会去修改服务器资源,要是一个安全的请求;
(4)浏览器默认不会缓存,需要每次发送跨域验证;
58.new 的时候干了什么?
(1)创建一个新对象;
(2)将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3)执行构造函数中的代码(为这个新对象添加属性);
59.当你打开浏览器是从输入网址到打开网址发生了什么事件?
解析你的 dns,返回响应的数据,服务器解析数据,客服端显示数据。
(1)浏览器(客户端)进行地址解析。
(2)将解析出的域名进行 dns 解析。
(3)通过 ip 寻址和 arp,找到目标(服务器)地址。
(4)进行 tcp 三次握手,建立 tcp 连接。
(5)浏览器发送数据,等待服务器响应。
(6)服务器处理请求,并对请求做出响应。
(7)浏览器收到服务器响应,得到 html 代码。
(8)渲染页面。
60.tcp 三次握手怎么理解?
1.客户端向服务器发送建立连接请求,并进入等待确认状态,等待服务器确认;
2.服务端收到消息返回后端,
3.客服端收到消息向服务端发送确认包
61.什么是可变对象,什么是不可变对象?
62.什么是数组变异方法,什么是非变异方法?
63.什么是深度监听?什么是浅度监听?
64.什么是事件循环?
JS 的代码执行是基于一种事件循环的机制,之所以称作事件循环,MDN 给出的解释为
因为它经常被用于类似如下的方式来实现
while (queue.waitForMessage()) {
queue.processNextMessage();
}
如果当前没有任何消息queue.waitForMessage 会等待同步消息到达
我们可以把它当成一种程序结构的模型,处理的方案。
65.什么是变量提升?
使用 var\function,浏览器读取代码的机制,预解析和预执行,把变量提升到最前面
66.遍历数组 for…in 和 for…of 的区别
67.项目开发过程中什么是开发环境、测试环境、生产环境、UAT 环境、仿真环
境?
68.Get 和 post 不同
69.什么是 csrf 攻击
Csrf(跨站点请求伪造) 攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份再攻击页面对目标网站
发起伪造用户操作的请求,达到攻击目的。
70.什么时候用深拷贝 /浅拷贝
无论深浅,都是需要的,当深拷贝发生时通常表明存在着一个聚合关系,当浅拷
贝发生时,通常表明存在着相识关系
举个简单例子:当实现一个组合模式 Composite Pattern 时通常都会实现深拷
贝,当实现一个观察者模式 Observer Pattern,时,就需要实现浅拷贝
71.什么是微任务,什么是宏任务?
==72.promise 和 settimeout(延时器)谁先执行? ==
73.前端 token 的使用?
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
3.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage
里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
4.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客
户端返回请求的数据
5.前端使用 token
(1).在验证登录成功之后,将服务端返回来的 token 值存储到 sessionStorage 中
(2)当客户端向服务端发起请求时,在请求头中加入服务端返回来的 token 值,本文设置
一个 axios 的拦截器,在该拦截器中设置 token,这样就可以不用在每次发起请求的时候,
在请求头中加 token 值
74.Http 缓存主要分为两种:强缓存和协商缓存。
75.字符串的方法
1.indexOf():返回字符串中检索指定字符第一次出现的位置,没找到就返
回-1
2.lastIndexOf():返回字符串中检索指定字符最后一次出现的位置,没找
到就返回-1。
3.search() 判断某个或某段字符在字符串中第一次出现的位置
4.match()匹配
5.replace( )替换
6.concat( )接收一个或多个字符拼接形成新的字符串
7.slice( start Index,endIndex )字符串裁切[ start Index,endIndex )
8.toUpperCase()字母转大写
9.toLowerCase( )字母转小写
10.trim()去除首尾空格
76.Git,GitHub 与 GitLab 的区别
77.JS 中作用域