跳转到内容

1 ​

浏览器和协议 ​

从输入url到展示页面加载的过程 ​

  1. 通过DNS解析获得网址的对应IP地址
  2. 浏览器与远程web服务器 通过TCP三次握手协商来建立一个 TCP/IP 连接
  3. 浏览器 通过TCP/IP连接 向web服务器 发送一个 HTTP 请求
  4. 服务器的永久重定向响应
  5. 浏览器跟踪重定向地址
  6. 服务器处理请求
  7. 服务器返回一个 HTTP 响应
  8. 浏览器渲染:解析HTML、解析CSS、解析JS、Render树

css ​

css那些元素属性可以继承,那些不能继承 ​

  1. 字体的一些属性:font
  2. 文本的一些属性:line-height
  3. 元素的可见性:visibility:hidden
  4. 表格布局的属性:border-spacing
  5. 列表的属性:1ist-style
  6. 页面样式属性:page
  7. 声音的样式属性

js ​

js的组成部分 ​

  1. ECMAScript:js的核心
  2. 文档对象模型:(DOM)
  3. 浏览器对象模型:(BOM)

js检测数据类型有哪些方式 ​

typeofinstanceofconstructorObject.prototype.toString.call()

什么是闭包,闭包有什么特点? ​

外部函数返回内部函数,内部函数又引用外部函数中的变量

特点:可以重复利用变量,并且这个变量不会污染全局的一种机制:这个变量是一直保存再内存中,不会被垃圾回收机制回收

缺点:闭包较多的时候,会消耗内存,导致页面的性能下降,在IE浏览器中才会导致内存泄漏

使用场景:防抖,节流,函数嵌套函数避免全局污染的时候

什么是事件委托 ​

又叫事件代理,原理就是利用了事件冒泡的机制来实现,也就是说把子元素的事件绑定到了父元素的身上

基本数据类型和引用数据类型的区别 ​

基本数据类型保存在栈内存当中,保存的就是一个具体的值

保存在堆内存当中,声明一个引用类型的变量,它保存的是引用类型数据的地址

假如声明两个引用类型同时指向了一个地址的时候,修改其中一个那么另外一个也会改变

说一下什么是原型链? ​

原型就是一个普通对象,它是为构造函数的实例共享属性和方法:所有实例中引用的原型都是同一个对象

使用prototype可以把方法挂在原型上,内存值保存一份

__proto__可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype)

当调用一个方法或获取一个属性时, 先从本对象上面找,再找对象的原型对象,再找原型对象的原型对象,一直找到Object的原型对象,这样原型套原型称为原型链

new操作符具体做了什么? ​

  1. 先创建一个空对象
  2. 把空对象和构造函数通过原型链进行链接
  3. 把构造函数的this绑定到新的空对象身上
  4. 根据构建函数返回的类型判断,如果是值类型,则返回对象,如果是引用类型,就要返回这个引用类型
js
function myNew(Fun, ...args){
    //1.先创建一个空对象
    let newobj  = {}
    //2.把空对象和构造函数通过原型链进行链接
    newobj.__proto__ = Fun.prototype
    //3.把构造函数的this绑定到新的空对象身上
    const result = Fun.apply(newobj,args)
    //4.根据构建函数返回的类型判断,如果是值类型,则返回对象,如果是引用类型,就要返回这个引用类型
    return result instanceof object ? result : newobj
}

js中关于this指向的问题 ​

  1. 全局对象中的this指向

    指向的是window

  2. 全局作用域或者普通函数中的this

    指向全局window

  3. this永远指向最后调用它的那个对象

    在不是箭头函数的情况下

  4. new关键词改变了this的指向

  5. apply,call,bind

    可以改变this指向,不是箭头函数

  6. 箭头函数中的this

    它的指向在定义的时候就已经确定了

    箭头函数它没有this,看外层是否有函数,有就是外层函数的this,没有就是window

  7. 匿名函数中的this

    永远指向了window,匿名函数的执行环境具有全局性,因此this指向window

script标签里的async和defer有什么区别? ​

它们的区别在于脚本加载和执行的时机:

  • async 属性:表示脚本的加载和页面的解析是异步进行的,也就是说同时进行,不会阻塞其他资源的加载。而在文档解析完毕后,立即执行脚本。当存在多个 async 脚本时,这些脚本的加载和执行顺序不能保证。

    示例:<script src="example.js" async></script>

  • defer 属性:表示脚本的加载是异步进行的,不会阻塞其他资源的加载,但是执行是在 HTML 解析完成后进行的,并且这些脚本会按照出现的先后顺序依次执行,因此它们之间的执行顺序是可预测的。

    示例:<script src="example.js" defer></script>

总的来说,如果开发者不需要在页面解析成树结构之前立即运行脚本,那么建议使用 async 或 defer,以便让页面更快地呈现给用户。如果需要保证代码的执行顺序,则选用 defer。

setTimeout最小执行时间是多少? ​

HTML5规定的内容:

​ setTimeout.最小执行时间是4ms

​ setInterval最小执行时间是10ms

箭头函数和普通函数的区别? ​

不能作为构造函数使用,不能用new

箭头函数就没有原型

箭头函数没有arguments

箭头函数不能用call,apply,bind去改变this的执行

this指向外层第一个函数的this

函数的call、apply、bind的区别? ​

都是改变this指向和函数的调用,call和applyi的功能类似,只是传参的方法不同

ca11方法传的是一个参数列表

apply传递的是一个数组

bind传参后不会立刻执行,会返回一个改变了this指向的函数,这个函数还是可以传参的,bind()()

cal1方法的性能要比apply好一些,所以cal1用的更多一点

用递归的时候有没有遇到什么问题? ​

如果一个函数内可以调用函数本身,那么这个就是递归函数 函数内部调用自己 特别注意:写递归必须要有退出条件return

说一下事件循环。 ​

]S是一个单线程的脚本语言

主线程 执行栈 任务队列 宏任务 微任务

主线程先执行同步任务,然后才去执行任务队列里的任务,如果在执行宏任务之前有微任务,那么要先执行微任务,全部执行完之后等待主线程的调用,调用完之后再去任务队列中查看是否有异步任务,这样一个循环往复的过程就是事件循环!

ajax是什么?怎么实现的? ​

创建交互式网页应用的网页开发技术

在不重新加载整个网页的前提下,与服务器交换数据并更新部分内容

通过XmlHttpRequest对象向服务器发送异步请求,然后从服务器拿到数据,最后通过]S操作DoM更新页面

  1. 创建XmlHttpRequest对象xmh
  2. 通过xmh对象里的open()方法和服务器建立连接
  3. 构建请求所需的数据,并通过xmh对象的send()发送给服务器
  4. 通过xmh对象的onreadystate chansge事件监听服务器和你的通信状态
  5. 接收并处理服务器响应的数据结果
  6. 把处理的数据更新到HTML页面上

get和post有什么区别? ​

  1. get一般是获取数据,post一般是提交数据
  2. get参数会放在url上,所以安全性比较差,post是放在body中
  3. get请求刷新服务器或退回是没有影响的,post请求退回时会重新提交数据
  4. get请求时会被缓存,post请求不会被缓存
  5. get请求会被保存在浏览器历史记录中,post不会
  6. get请求只能进行url编码,post请求支持很多种

promise的内部原理是什么?它的优缺点是什么? ​

Promise对象,封装了一个异步操作并且还可以获取成功或失败的结果

Promise主要就是解决回调地狱的问题,之前如果异步任务比较多,同时他们之间有相互依赖的关系,

就只能使用回调函数处理,这样就容易形成回调地狱,代码的可读性差,可维护性也很差

有三种状态:pending初始状态,fulfilled成功状态,rejected失败状态

状态改变只会有两种情况,

pending -> fulfilled; pending -> rejected 一旦发生,状态就会凝固,不会再变

首先就是我们无法取消promise,一旦创建它就会立即执行,不能中途取消

如果不设置回调,promise内部抛出的测u哦鸣就无法反馈到外面

若当前处于pending?状态时,无法得知目前在哪个阶段。

原理:

构造一个Promise实例,实例需要传递函数的参数,这个函数有两个形参,分别都是函数类型,一个是resolve一个是reject

promise.上还有then方法,这个方法就是来指定状态改变时的确定操作,resolve是执行第一个函数,reject是执行第二个函数

promise和async await的区别是什么? ​

  1. 都是处理异步请求的方式
  2. promise是ES6,async await是ES7的语法
  3. async await是基于promise实现的,他和promise都是非阻塞性的

优缺点:

  1. promise是返回对象我们要用then,catch方法去处理和捕获异常,并且书写方式是链式,容易造成代码重叠,不好维护,async await是通过tra catch进行捕获异常
  2. async await:最大的优点就是能让代码看起来像同步一样,只要遇到await.就会立刻返回结果,然后再执行后面的操作promise.then()的方式返回,会出现请求还没返回,就执行了后面的操附

浏览器的存储方式有哪些? ​

  1. cookies

    H5标准前的本地存储方式 兼容性好,请求头自带cookie 存储量小,资源浪费,使用麻烦(封装)

  2. localstorage

    H5加入的以键值对为标准的方式 操作方便,永久存储,兼容性较好 保存值的类型被限定,浏览器在隐私模式下不可读取,不能被爬虫

  3. sessionstorage

    当前页面关闭后就会立刻清理,会话级别的存储方式

  4. indexedDB I

    H5标准的存储方式,,他是以键值对进行存储,可以快速读取,适合WEB场景

token的登录流程。 ​

  1. 客户端用账号密码请求登录
  2. 服务端收到请求后,需要去验证账号密码
  3. 验证成功之后,服务端会签发一个token,把这个token发送给客户端
  4. 客户端收到token.后保存起来,可以放在cookie也可以是localstorage
  5. 客户端每次向服务端发送请求资源的时候,都需要携带这个token
  6. 服务端收到请求,接着去验证客户端里的token,验证成功才会返回客户端请求的数据

页面渲染的过程是怎样的? ​

  1. DNS解析
  2. 建立TCP连接
  3. 发送HTTP请求
  4. 服务器处理请求
  5. 渲染页面
    1. 浏览器会获取HTML和CSS的资源,然后把HTML解析成DOM树
    2. 再把cSs解析成CSSOM
    3. 把DOM和CSSOM合并为渲染树
    4. 布局
    5. 把渲染树的每个节点渲染到屏幕上(绘制)
  6. 断开TCP连接

DOM树和渲染树有什么区别? ​

DOM树是和HTML标签一一对应的,包括head和隐藏元素

渲染树是不包含head和隐藏元素

精灵图和base64的区别是什么? ​

精灵图:把多张小图整合到一张大图上,利用定位的一些属性把小图显示在页面上,当访问页面可以减少请求,提高加载速度

base64:传输8Bit字节代码的编码方式,把原本二进制形式转为64个字符的单位,最后组成字符串 base64是会和html css一起下载到浏览器中,减少请求,减少跨域问题,但是一些低版本不支持,若base64体积比原图片大,不利于css的加载。

svg格式了解多少? ​

基于ML语法格式的图像格式,可缩放矢量图,其他图像是基于像素的,SVG是属于对图像形状的描述,本质是文本文件,体积小,并且不管放大多少倍都不会失真

  1. SVG可直接插入页面中,成为D0M一部分,然后用]S或CSS进行操作

    <svg></svg>

  2. SVG可作为文件被引入

    <img src="pic.svg"/

  3. SVG可以转为base64引入页面

了解过JwT吗? ​

JSON Web Token通过JSON形式作为在web应用中的令牌,可以在各方之间安全的把信息作为JSON对象传输信息、授权

JWT的认证流程

  1. 前端把账号密码发送给后端的接口
  2. 后端核对账号密码成功后,把用户id等其他信息作为JwT负载,把它和头部分别进行base64编码拼接后签名,形成一个JWT(token)。
  3. 前端每日请求时都会把JWT放在HTTP请求头的Authorization字段内
  4. 后端检查是否存在,如果存在就验证JwT的有效性(签名是否正确,token是否过期)
  5. 验证通过后后端使用]WT中包含的用户信息进行其他的操作,并返回对应结果

简洁、包含性、因为Token是JSON加密的形式保存在客户端,所以JwT是跨语言的,原则上是任何web形式都支持。

npm的底层环境是什么? ​

node package manager,node的包管理和分发工具,已经成为分发node模块的标准,是]s的运行环境

npm的组成:网站、注册表、命令行工具

说一下浏览器的缓存策略。 ​

强缓存((本地缓存)、协商缓存(弱缓存)

强缓:不发起请求,直接使用缓存里的内容,浏览器把 JS,CSS,image等存到内存中,下次用户访问直接从内存中取,提高性能

协缓:需要像后台发请求,通过判断来决定是否使用协商缓存,如果请求内容没有变化,则返回3©4,浏览器就用缓存里的

内容

强缓存的触发:

​ HTTP1.0:时间戳响应标头

​ HTTP1.1:Cache-Control响应标头

协商缓存触发:

​ HTTP1.0:请求头:if-modified-since响应头:last-modified

​ HTTP1.l:请求头:if-none-match响应头:Etag

说一下什么是同源策略 ​

同源策略是浏览器的核心,如果没有这个策略就会遭受网络攻击

主要指的就是协议+域名+端口号三者一致,若其中一个不一样则不是同源,会产生跨域

三个允许跨域加载资源的标签:img link script

跨域是可以发送请求,后端也会正常返回结果,只不过这个结果被浏览器拦截了!

JSONP CORS websocket 反向代理

防抖和节流是什么? ​

都是应对页面中频繁触发事件的优化方案 防抖:避免事件重复触发 使用场景:1.频繁和服务端交互2.输入框的自动保存事件 节流:把频繁触发的事件减少,每隔一段时间执行 使用场景:scro11事件

解释一下什么是json? ​

JSON是一种纯字符串形式的数据,它本身不提供任何方法,适合在网络中进行传输 JSON数据存储在,json文件中,也可以把]SoN数据以字符串的形式保存在数据库、Cookise中 js提供了JSON.parse()JSON.stringify() 什么时候使用json:定义接口:序列化:生成token;配置文件package.json

HTML5 CSS3 ​

语义化的理解。 ​

在写HTML页面结构时所用的标签有意义

头部用head主体用main底部用foot,·.

怎么判断页面是否语义化了?

把cSS去掉,如果能够清晰的看出来页面结构,显示内容较为正常

为什么要选择语义化?

  1. 让HTML结构更加清晰明了
  2. 方便团队协作,利于开发
  3. 有利于爬虫和SE0
  4. 能够让浏览器更好的去解析代码
  5. 给用户带来良好的体验

H5C3有哪些新特性? ​

H5的新特性:

  1. 语义化的标签
  2. 新增音频视频
  3. 画布canvas
  4. 数据存储1 ocalstorage sessionstorage
  5. 增加了表单控件emai1 url search...
  6. 拖拽释放API

CSS3的新特性:

  • 新增选择器:属性选择器、伪类选择器、伪元素选择器
  • 增加了媒体查询
  • 文字阴影
  • 边框
  • 盒子模型box-sizing
  • 渐变
  • 过度
  • 自定义动画
  • 背景的属性
  • 2D和3D

如何理解MWM的? 是Model-View-ViewModel的缩写。前端开发的架构模式 M:模型,对应的就是data的数据 V:视图,用户界面,DOM VM:视图模型:Vue的实例对象,连接View和Model的桥梁 核心是提供对View和ViewModel的双向数据绑定,当数据改变的时候,ViewModel能监听到数据的变化,自动更新视图, 当用户操作视图的时候,ViewModel也可以监听到视图的变化,然后通知数据进行改动,这就实现了双向数据绑定 ViewModel通过双向绑定把View和Model:连接起来,他们之间的同步是自动的,不需要认为干涉,所以我们只需要关注业 务逻辑即可,不需要操作DOM,同时也不需要关注数据的状态问题,因为她是由MM统一管理

Vue ​

如何理解MVVM的? ​

是Model-View-ViewModel的缩写。前端开发的架构模式

M: 模型,对应的就是data的数据 V: 视图,用户界面,DOM VM: 视图模型:Vue的实例对象,连接View和Model的桥梁

核心是提供对View和ViewModel的双向数据绑定,当数据改变的时候,ViewModel能监听到数据的变化,自动更新视图, 当用户操作视图的时候,ViewModel也可以监听到视图的变化,然后通知数据进行改动,这就实现了双向数据绑定 ViewModel通过双向绑定把View和Model:连接起来,他们之间的同步是自动的,不需要认为干涉,所以我们只需要关注业 务逻辑即可,不需要操作DOM,同时也不需要关注数据的状态问题,因为她是由MM统一管理

vue路由的hash模式和history模式有什么区别? ​

  1. hash的路由地址上有#号,history模式没有
  2. 在做回车刷新的时候,hash模式会加载对应页面,history会报错4a4
  3. hash模式支持低版本浏览器,history.不支持,因为是H5新增的API
  4. hash不会重新加载页面,单页面应用必备
  5. history有历史记录,H5新增了pushState和replacestate()去修改历史记录,并不会立刻发送请求
  6. history需要后台配置

最后更新于: