HTML
- 在地址栏里输入一个URL,到这个页面呈现出来,中间会发生什么?
参考回答:
输入url后,首先需要找到这个url域名的服务器ip,为了寻找这个ip,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存-》系统缓存-》路由器缓存,缓存中没有则查找系统的hosts文件中是否有记录,如果没有则查询DNS服务器,得到服务器的ip地址后,浏览器根据这个ip以及相应的端口号,构造一个http请求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,并将这个http请求封装在一个tcp包中,这个tcp包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应,返回相应的html给浏览器,因为html是一个树形结构,浏览器根据这个html来构建DOM树,在dom树的构建过程中如果遇到JS脚本和外部JS连接,则会停止构建DOM树来执行和下载相应的代码,这会造成阻塞,这就是为什么推荐JS代码应该放在html代码的后面,之后根据外部样式,内部样式,内联样式构建一个CSS对象模型树CSSOM树,构建完成后和DOM树合并为渲染树,这里主要做的是排除非视觉节点,比如script,meta标签和排除display为none的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为html文件中会含有图片,视频,音频等资源,在解析DOM的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是4-6个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过Cache-Control、Last-Modify、Expires等首部字段控制。 Cache-Control和Expires的区别在于Cache-Control使用相对时间,Expires使用的是基于服务器 端的绝对时间,因为存在时差问题,一般采用Cache-Control,在请求这些有设置了缓存的数据时,会先 查看是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修改,如果上一次 响应设置了ETag值会在这次请求的时候作为If-None-Match的值交给服务器校验,如果一致,继续校验 Last-Modified,没有设置ETag则直接验证Last-Modified,再决定是否返回304
- 什么是跨域, 怎么解决跨域
协议、域名、端口三者中有不一样的就是跨域
解决方法:
- CORS. 通过设置 access-control-allow-origin: *
- nginx 反向代理。 通过设置proxy_pass
- jsonp
- src与href的区别
src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求 src 资源时会将其指向的资源下载并应用到文档内,例如 js 脚本,img 图片和 frame 等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js 脚本放在底部而不是头部。
href 是 Hypertext Reference 的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,浏览器会识别该文档为 css 文件,就会并行下载资源并且不会停止对当前文档的处理。 这也是为什么建议使用 link 方式来加载 css,而不是使用@import 方式。
DOM
- input与change的区别
input在输入框输入的时候会实时触发
change只会在输入框失去焦点且值改变了的情况下才会触发
- 若一个页面有多个同名id的DOM元素,通过getElementById获取到的是怎样的值
同名的第一个DOM元素
CSS
- 什么是伪类,什么是伪元素,两个的区别
伪类:
伪类用于当已有的元素处于某个状态时,为其添加样式。这个状态时根据用户行为而动态变化的。
伪元素:
伪元素用于创建一些不在文档树中的元素,并为其添加样式。
两者的区别是:
有没有创建一个文档树外的元素。伪类的操作对象是文档树中已有的元素,而伪元素则是创建了一个文档树外的元素。
- 使用伪元素的优点
能减少DOM元素的渲染数量
- position有哪些属性,分别如何定位的
1. static 默认值,没有定位。出现在正常文档流中
2. relative 相对定位。相对于其正常位置进行定位
3. absolute 绝对定位。相对于 static 定位之外的第一个父元素进行定位
4. fixed 绝对定位。相对于浏览器窗口进行定位
5. sticky 基于用户的滚动位置进行定位。相当于relative于fixed的结合体。
- 说一下em的使用方式
子元素的字体大小是相对于父元素字体大小
元素的width/height/margin/padding用em的话是相对于该元素的font-size
line-height
分别取值为[1.5, 1.5em, 150%]的区别
line-height
是相对于元素自身的font-size
大小来取值的,但同时会被继承。所以当line-height
设置为1.5em
或者150%
可能会出现问题。
比如:
父元素:font-size: 18px; line-height: 1.5em
,他的line-height
计算下来是27px, (150%同理)。
子元素:font-size: 30px
,在没有设置line-height
的情况下,它继承父元素的line-height
为27px,此时会出现问题
JS
- includes 与 indexOf 的区别
- includes 能判断是否包含NaN, indexOf 不能
- 当数组中有空值(empty),includes会认为是undefined, indexOf不会
- 使用js实现重载
/**
* 实现的原理是使用闭包
*/
function addMethod(object, name, fn){
// 把前一次添加的方法存在一个临时变量old里面
let old = object[name]
// 重写object[name]
object[name] = function(){
let executeFn = fn.length == arguments.length ? fn : old
return executeFn.apply(this,arguments)
}
}
- 看知识点累了,我们来做道题吧。(手动狗头) 点击查看详细题解
var x = 1;
function f(x, y = function () { x = 3; console.log(x); }) {
console.log(x)
var x = 2
y()
console.log(x)
}
f()
console.log(x)
//1、上面的代码输出的是什么?
//2、如果把var x = 2注释掉,输出的又是什么?
//3、如果把f函数第一个参数x改成xx,输出的又是什么?
//4、如果把f函数第一个参数x设置了默认值为4,输出的又是什么?
/**
* 注意的点
* 1. 设置了默认值的函数在进行初始化声明的时候, 参数会形成一个单独的作用域
* 2. 函数能访问的变量是在定义的时候确定的,不是在执行的时候确定的
* 3. 函数体内的变量名与参数相同,提升后的变量变量初始值与初始化后的参数一致。(var变量声明提升时会将参数的默认值赋给变量)
*
* 答案
* 1. undefined 3 2 1
* 2. undefined 3 3 1
* 3. undefined 3 2 3
* 4. 4 3 2 1
*/
- CommonJS 与 ES Module的区别
- CommonJS 是同步导入, 因为用于服务端,文件都在本地, 同步导入即使卡住主线程影响也不大。而ES Module 是异步导入,因为用于浏览器,需要下载文件,如果也采用同步导入会对渲染有很大影响
- CommonJS 导出时都是值拷贝,就算导出的值改变了,导入的值也不会变。ES Module 采用实时绑定的方式, 导入导出的值都指向同一个内存地址,所以导入值会随着导出值改变。
- typeof 能否正确判断类型?
typeof 对于原始类型来说,除了null外都能正确判断类型。typeof null 会输出object。在JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息, 000 开头代表对象, 而null表示为全零, 所以会将他错误判断为object。虽然现在的内部类型判断代码已经改变,但是这个bug却一直流传下来。
typeof 对于对象类型来说,除了函数都会显示为object。 故不能正确判断对象类型的变量的类型
- instanceof 能正确判断对象的原理是什么?
instanceof 的判断机制是通过原型链来判断的。 instanceof 不是百分百准确的。 可以通过改写静态方法 Symbol.hasInstance 来自定义instanceof行为
VUE
- 组件间传值的方式
- $attrs 与 l i s t e n e r s 分别传递属性与事件。(要注意的是 listeners 分别传递属性与事件。(要注意的是 listeners分别传递属性与事件。(要注意的是listeners在vue3移除了。 统一通过$attrs进行传递)
- props、$emit
- EventBus( e m i t 、 emit、 emit、on)
- Vuex
- provide、inject
- p a r e n t 、 parent、 parent、children
- 在keepAlive中同时设置
include
与exclude
,哪个优先级高
exclude
的优先级高。
解析:
从红框中,我们可以看到如果满足如下两个条件之一就会直接返回组件不缓存组件:
- 有设置
include
且(
name
为空 或者name
不在include
里面)
- 有设置
exclude
且name
有值 且 name在exclude
里面
现在题目是假设name
有值, 且同时设置在了include
与exlude
里面。 此时根据逻辑判断, 它在判断1中为false
, 在判断2中为true
, 所以它满足if的条件判断,直接返回组件。