微派三轮面试总结

三轮技术面

面试周期:2023.6.19——2023.6.26

目录

一面:

1. 介绍一下自己的项目

2. Vue2中父子组件的声明周期执行顺序是怎么样的

3. computed和watch的区别

4. Vue路由中包含两种模式。hash和history,它们的区别是什么

5. Vue组件访问数据的方式

6. 对于Vuex的理解

7. 使用Vuex时,如果在一个组件中修改了一个state中的值,在另一个组件中如何能知道这个值被修改了

8. ES6中let、const和var有什么区别

9. 前端模块中CommonJS和ES6模块化的区别

10. 手写题:发布订阅制模式

二面:

1. 插槽的类型有哪些,有什么区别

2. keep-alive有了解过吗

3. 如果一个页面中使用了keep-alive,那么再次访问这个页面的时候会执行生命周期吗

4. nextTick有了解过吗,属于异步任务吗

5. PC端浏览器中在页面渲染的过程中都有什么缓存

6. 输入URL后到页面加载的过程是怎么样的

7. 浏览器渲染过程是怎么样的

8. script标签中defer和async是什么意思,它们有什么区别

9. 304代表什么意思,命中的是哪个缓存

10. 浏览器渲染页面时出现卡顿可能的原因有哪些

11. 手写题:Promise.all

三面:

1. 谈谈过往记忆深刻的项目

2. 算法题:寻找数组中的非重复的第二大元素

3. code review 是如何做的

4. 在做小程序抓包的时候是如何去做的

5. ts和js的区别

6. 对js闭包的理解,在使用的时候会出现什么坑吗

7. CSS3解决的主要问题是什么

8. 页面布局方式有哪些

9. git提交代码的时候,出现冲突是如何解决的

10. 认为工作当中哪几个特性是比较重要的

11. 令你最深刻的一本书是什么


一面:

1. 介绍一下自己的项目

就项目问了几个问题,所以,项目一定要准备好亮点、难点以及是如何解决的。

2. Vue2中父子组件的声明周期执行顺序是怎么样的

父组件 created  =>  子组件created  =>  子组件 mounted  =>  父组件 mounted

3. computed和watch的区别

都是用来监听数据变化的选项。

1)computed 是返回计算结果,计算属性的值会被缓存,只有当数据发生变化的时候才会重新计算,所以不支持异步操作,如果包含异步操作,那么计算结果就无法被缓存。它适用于处理需要计算或者转换的数据。

2)watch 可以看作是一种观察者模式,参数包括新旧两个参数,当数据发生变化时,会自动执行相应的回调函数,支持异步,没有缓存。常用于处理需要进行异步或者复杂操作的情况。

4. Vue路由中包含两种模式。hash和history,它们的区别是什么

1)URL格式上:hash 有 # 符号,history没有。

2)服务器支持上:hash 模式不需要服务器支持,是通过 js 的 onhashchange 事件来监听的;history 模式需要服务器支持,需要服务器进行配置。

3)页面刷新上:hash 模式下页面刷新不会影响当前路由,因为路由信息存储在URL的 # 后面;history 模式下页面刷新会向服务器发送请求。

4)SEO效果上:SEO即搜索引擎优化,hash 模式因为有 #,所以SEO效果不好,因为搜索引擎不会抓取 # 后面的内容,是会抓取前面的;history 模式对SEO更加友好。

5)兼容性上:hash 模式是浏览器默认的模式,兼容较低版本。

6)处理错误上:hash 模式下如果url出现错误,浏览器会直接显示404页面;history 模式下如果url出现错误,则会向服务器发送请求,服务器会返回404页面未找到的错误。

5. Vue组件访问数据的方式

首先判断是否为父子组件,父传子使用 props,子传父使用 $emit,如果不是,则考虑使用vuex。

6. 对于Vuex的理解

vuex 是一种状态管理模式,它采用集中式的方式进行存储,以一个全局的模式进行管理,能够实现数据的共享,并且数据都是响应式的。解决了组件通信中各组件数据通信的问题。

7. 使用Vuex时,如果在一个组件中修改了一个state中的值,在另一个组件中如何能知道这个值被修改了

使用 computed、watch 进行监听。

8. ES6中let、const和var有什么区别

1)var 存在变量提升,let 不存在。

2)var 是函数作用域,let 是块级作用域。

3)var 可以重复声明,let 不可以重复声明。

4)const 声明时必须赋值,并且值在之后不能修改(如果值的类型是一个对象,可以修改对象中的属性)

9. 前端模块中CommonJS和ES6模块化的区别

首先,语法不同;其次,CommonJS 是运行时加载,ES6模块是编译时加载。

10. 手写题:发布订阅制模式

class Publisher {
  constructor() {
    this.subscribers = [];
  }
  subscribers(subscriber) {
    this.subscribers.push(subscriber);
  }
  unsubscribers(subscriber) {
    const index = this.subscribers.indexOf(subscriber);
    if (index == -1) {
      this.subscribers.splice(index, 1);
    }
  }
  notify(message) {
    this.subscribers.forEach(subscriber => {
      subscriber.update(message)
    })
  }
}

二面:

1. 插槽的类型有哪些,有什么区别

插槽是一种组件间通信的机制,主要的作用是向子组件的指定位置插入一段内容,插槽的常见类型有:默认插槽、具名插槽、作用域插槽。

具名插槽和作用域插槽的区别:

具名插槽适合用于需要在组件内部插入不同内容的场景,例如一个容器组件需要显示不同的标题、内容、按钮等;作用域插槽适合用于需要在组件内部根据父组件的数据进行动态渲染的场景。

注意:遇到动态渲染组件时,虽然可以不使用作用域插槽,直接在组件中增加一些逻辑,但那样我们封装组件的意义就不是很大了,显然使用作用域插槽是比较好的办法。

2. keep-alive有了解过吗

是一个内置组件,用于缓存一些组件实例,以便在切换时能够记住状态,可以用于优化组件的性能,避免不必要的组件重新渲染。

3. 如果一个页面中使用了keep-alive,那么再次访问这个页面的时候会执行生命周期吗

不会,vue 会将缓存的组件实例直接激活,并执行 activated 生命周期钩子函数。需要注意的是,如果一个组件被缓存,那么它的状态和数据会被保留在内存中,并且不会被重置,如果需要在组件被重新激活时进行一些特殊处理,可以在 activated 钩子函数中进行相应的操作,例如重新加载数据、重置组件状态等。

4. nextTick有了解过吗,属于异步任务吗

是异步任务。这个方法的作用是在下次DOM更新循环结束之后执行延迟回调(在 vue 中修改数据之后,DOM不会立即更新,而是会等待一段时间之后才会更新,此方法就是用来在这个更新周期结束之后才会执行的回调)。

5. PC端浏览器中在页面渲染的过程中都有什么缓存

1)浏览器缓存:会将页面中的静态资源(图片、css、js文件等)存到本地,以减少重复下载的次数,提高页面的加载速度,包括强缓存和协商缓存。

2)DNS缓存:当一个浏览器请求一个URL时,会先在本地DNS缓存中查找对应的IP地址,如果找到了就直接访问,否则会向DNS服务器发送请求获取IP地址。

3)TCP缓存:TCP协议会在传输数据时对数据进行分段和重组,这些分段和重组的数据会在客户端和服务器端进行缓存,以减少网络请求次数。

4)操作系统缓存:操作系统会将常用的文件和数据缓存到内存中,以加快访问速度,例如操作系统会将常用的文件和目录缓存到内存中,以减少磁盘读取的次数。

6. 输入URL后到页面加载的过程是怎么样的

从输入URL到浏览器显示页面的过程中都发生了什么?_从输入url到浏览器显示页面发生了什么_Baobao小包的博客-CSDN博客

7. 浏览器渲染过程是怎么样的

  • 解析HTML:解析成DOM树
  • 解析CSS:解析成CSSOM,构成样式规则的树形结构
  • 布局:生成渲染树Render Tree
  • 绘制:遍历渲染树,绘制成屏幕上的像素
  • 合成:将屏幕上不同的层合成为同一张完整的页面

8. script标签中defer和async是什么意思,它们有什么区别

浏览器在解析HTML时,如果遇到一个没有任何属性的 script 标签,就会暂停解析,先发送网络请求获取该JS脚本的代码内容,然后让JS引擎执行该代码,当代码执行完毕后HTML继续解析。所以,script 阻塞了浏览器对HTML的解析,如果获取JS脚本的网络请求迟迟得不到响应,或者JS脚本执行时间过长,都会导致白屏,用户看不到页面内容。

async script

async 表示异步,当浏览器遇到带有 async 属性的 script 时,请求该脚本的网络请求是异步的,不会阻塞浏览器解析HTML,一旦网络请求回来之后,如果此时HTML还没有解析完,浏览器会暂停解析,先让JS引擎执行代码,执行完毕之后再解析HTML。所以,async 是不可控的,因为执行的时间是不确定的,可能在获取某个DOM元素时获取不到。而且如果存在多个 async script 时,它们之间的执行顺序也不确定,完全依赖于网络的传输快慢。

defer script

defer 表示延迟,获取该脚本的网络请求也是异步的,不会阻塞浏览器解析HTML,一旦网络请求回来之后,如果此时HTML还没有解析完,浏览器会等待HTML解析完毕之后再执行JS代码。所以,不会存在带有 async 属性的那种获取不到DOM元素的情况,并且如果存在多个 defer script 标签,浏览器会保证它们按照在HTML中出现的顺序执行。

9. 304代表什么意思,命中的是哪个缓存

代表数据没有发生变化,继续访问缓存。命中的是协商缓存。

10. 浏览器渲染页面时出现卡顿可能的原因有哪些

请求数据大、重绘和回流多、js执行时间过长、大量的DOM操作、大量的网络请求、CSS样式过于复杂、图片过大或过多。

11. 手写题:Promise.all

function isPromise(obj) {
  return !!obj && (typeof obj === 'function' || typeof obj === 'object') && typeof obj.then === 'function';
}

function promiseAll(arr) {
  let res = [];
  return new Promise((resolve, reject) => {
    for (let i = 0; i < arr.length; i++) {
      if (isPromise(arr[i])) {
        arr[i].then(data => {
          res[i] = data;
          if (res.length === arr.length) {
            resolve(res)
          }
        }).catch(error => {
          reject(error)
        })
      } else {
        res[i] = arr[i]
      }
    }
  })
}

三面:

1. 谈谈过往记忆深刻的项目

...... (项目中的问题)

2. 算法题:寻找数组中的非重复的第二大元素

3. code review 是如何做的

4. 在做小程序抓包的时候是如何去做的

5. ts和js的区别

1)类型系统:TS是一个强类型语言,它支持静态类型检查,需要显示地声明变量的类型,编辑器会对代码进行类型检查;JS是一种动态类型语言,是在运行时通过变量值来自动判断的。

2)扩展性:TS是JS的超集,它扩展了JS的语法和功能,支持ES6及以上的语法特性,同时也提供了一些新的特性和工具,如接口、枚举、命名空间、装饰器等。

3)可维护性:TS的类型系统和语法特性可以提高代码的可读性和可维护性,避免了一些潜在的错误和bug,使代码更加健壮可靠。

4)编译方式:TS需要通过编译器将TS代码编译成JS代码,然后在浏览器运行;而JS是一种解释型语言,不需要编译过程,可以直接在浏览器环境中运行。

6. 对js闭包的理解,在使用的时候会出现什么坑吗

会出现内存泄露的问题。

7. CSS3解决的主要问题是什么

1)布局问题:引入了弹性盒子布局、网格布局和多列布局等新的布局方式,解决了CS2在布局上的局限性。

2)样式问题:引入了圆角、阴影、渐变、动画、过渡等新的样式特性,使页面样式更加丰富和生动。

3)响应式问题:引入了媒体查询和可缩放矢量图形等技术,使页面能够根据不同的尺寸和屏幕分辨率进行自适应布局和图片显示。

4)字体问题:引入了@font-face规则和web字体等技术,使开发者可以自由选择和使用更多的字体。

8. 页面布局方式有哪些

1)流式布局:基本的页面布局。

2)定位布局:需要手动设置元素的位置和大小,不利于响应式设计。

3)弹性盒子布局:flex布局,通过属性来控制元素的位置和大小,支持响应式设计。

4)响应式布局:能够自适应不同屏幕大小和设备类型的网页设计方式,通过使用CSS媒体查询和弹性盒子布局等技术,实现在不用的设备上自动适应布局和样式。

9. git提交代码的时候,出现冲突是如何解决的

10. 认为工作当中哪几个特性是比较重要的

专业能力、自我管理能力、团队合作能力、适应能力、目标导向。

11. 令你最深刻的一本书是什么

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
可以用结构体来保存实习生信息,然后用数组存储多个实习生的信息。具体步骤如下: 1. 定义一个结构体类型,包含实习生的姓名、年龄、性别和专业等信息。 2. 定义一个数组,存储多个实习生的信息。 3. 使用 scanf 函数输入每个实习生的信息,并存储到结构体数组中。 4. 使用循环遍历结构体数组,将每个实习生的信息依次输出。 下面是示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_STUDENTS 3 struct Student { char name[20]; int age; char gender[5]; char major[20]; }; int main() { struct Student students[MAX_STUDENTS]; int i; for (i = 0; i < MAX_STUDENTS; i++) { printf("请输入第%d个实习生的信息:\n", i + 1); printf("姓名:"); scanf("%s", students[i].name); printf("年龄:"); scanf("%d", &students[i].age); printf("性别:"); scanf("%s", students[i].gender); printf("专业:"); scanf("%s", students[i].major); } printf("\n实习生信息如下:\n"); for (i = 0; i < MAX_STUDENTS; i++) { printf("姓名:%s\n", students[i].name); printf("年龄:%d\n", students[i].age); printf("性别:%s\n", students[i].gender); printf("专业:%s\n", students[i].major); printf("\n"); } return 0; } ``` 运行结果: ``` 请输入第1个实习生的信息: 姓名:张三 年龄:20 性别:男 专业:计算机科学与技术 请输入第2个实习生的信息: 姓名:李四 年龄:21 性别:女 专业:软件工程 请输入第3个实习生的信息: 姓名:王五 年龄:22 性别:男 专业:网络工程 实习生信息如下: 姓名:张三 年龄:20 性别:男 专业:计算机科学与技术 姓名:李四 年龄:21 性别:女 专业:软件工程 姓名:王五 年龄:22 性别:男 专业:网络工程 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值