type
Post
status
Published
date
Feb 29, 2024
slug
interview-self
summary
个人面试真实提问
tags
思考
文字
category
知行合一
icon
password
个人面试记录,主要是回答不完善的问题
1.Node.js中的事件循环
在Node.js中,事件循环是一种用于处理异步操作的机制,它是Node.js运行时的核心部分之一。Node.js的事件循环基于事件驱动模型,允许在执行异步操作时不阻塞主线程,以提高性能和吞吐量。
事件循环的基本概念是,Node.js会在单线程中运行一个循环,该循环会不断地检查事件队列是否有待处理的事件。当事件队列中有事件时,Node.js会从队列中取出一个事件,并且执行与该事件相关联的回调函数。这个过程是循环进行的,因此被称为事件循环。
事件循环的执行过程如下:
- 执行同步代码:首先执行当前代码中的同步任务,这些任务会立即执行,不会进入事件队列。
- 处理事件队列:检查事件队列是否有待处理的事件。如果有,Node.js会从队列中取出一个事件,并执行与该事件相关联的回调函数。
- 等待新事件:如果事件队列为空,Node.js会等待新的事件被添加到队列中。
事件循环的执行过程是单线程的,这意味着在任何给定时间点,Node.js只能执行一个事件。因此,异步操作通常是通过回调函数的方式来实现的,这样可以避免阻塞主线程的执行。
Node.js中的事件循环与浏览器中的事件循环有些许不同,但基本的概念是相似的。Node.js使用libuv库来实现事件循环,它提供了跨平台的异步I/O操作,例如文件系统操作、网络请求等,以及对事件循环的管理。
2.Vue2和Vue3的区别
Vue 3 是 Vue.js 框架的最新版本,它在 Vue 2 的基础上进行了许多改进和更新。以下是 Vue 2 和 Vue 3 之间的一些主要区别:
性能
Vue 3 在性能方面进行了许多优化,包括:
- 重写了虚拟 DOM 实现
- 编译模板的优化
- 更高效的组件初始化
这些优化导致 Vue 3 的整体性能比 Vue 2 提高了 1.3 到 2 倍。
体积
Vue 3 的体积比 Vue 2 小约 40%。这是由于 Vue 3 删除了一些不必要的代码并进行了其他优化。
易用性
Vue 3 引入了许多新的功能和 API,旨在提高开发人员的易用性。这些功能包括:
- Composition API
- TypeScript 支持
- 新的内置指令
其他区别
Vue 3 和 Vue 2 之间还有一些其他区别,包括:
- Vue 3 不再支持 IE 11
- Vue 3 使用 Proxy API 进行双向数据绑定
- Vue 3 的生命周期钩子函数发生了一些变化
双向数据绑定
Vue 2 使用 Object.defineProperty API 来实现双向数据绑定。这在大多数情况下都很好,但它有一些限制。例如,它无法监听数组的变化。
Vue 3 使用 Proxy API 来实现双向数据绑定。Proxy API 更加灵活,可以监听数组和其他数据结构的变化。
生命周期钩子函数
Vue 2 和 Vue 3 的生命周期钩子函数略有不同。例如,Vue 3 中的
beforeCreate 钩子函数已被 created 钩子函数替换。Composition API
Composition API 是 Vue 3 中引入的新 API。它允许开发人员以更灵活的方式创建组件。
TypeScript 支持
Vue 3 提供开箱即用的 TypeScript 支持。这使得开发人员可以使用 TypeScript 来编写 Vue 代码,从而提高代码的质量和可维护性。
总体而言,Vue 3 是 Vue 2 的重大升级。它提供了许多改进和更新,可以提高性能、体积和易用性。
3.Typescript常见的注解
TypeScript 常见的注解包括:
- 类型注解:用于声明变量、函数和类型的类型。
- 装饰器:用于在类、方法、属性和参数上添加元数据。
- 表达式注解:用于将表达式转换为指定类型或检查表达式是否为指定类型的实例。
类型注解
类型注解是 TypeScript 中最常见的注解。它们用于声明变量、函数和类型的类型。类型注解可以帮助 TypeScript 编译器检查代码中的类型错误。
以下是一些类型注解的示例:
装饰器
装饰器是 TypeScript 中的另一个常见注解。它们用于在类、方法、属性和参数上添加元数据。装饰器可以用于许多目的,例如:
- 添加功能
- 更改类的行为
- 提供元数据
以下是一些装饰器的示例:
表达式注解
表达式注解是 TypeScript 中的第三种常见注解。它们用于将表达式转换为指定类型或检查表达式是否为指定类型的实例。
以下是一些表达式注解的示例:
有关 TypeScript 注解的更多信息,请参阅 TypeScript 文档。
JS中的基础数据类型
JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。
其中 Symbol 和 BigInt 是ES6 中新增的数据类型:
●Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
●BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
这些数据可以分为原始数据类型和引用数据类型:
●栈:原始数据类型(Undefined、Null、Boolean、Number、String)
●堆:引用数据类型(对象、数组和函数)
两种类型的区别在于存储位置的不同:
●原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
●引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:
●在数据结构中,栈中数据的存取方式为先进后出。
●堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。
在操作系统中,内存被分为栈区和堆区:
●栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
●堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。