1. 数据类型
-
基本数据类型:
stringnumberbooleannullundefinedsymbolbigint
-
引用数据类型:
objectfunctionarray
2. 原型的作用
原型的存在目的在于实现面向对象编程。JS为了实现面向对象,采用原型作为其中一种实现手段。一个支持面向对象的语言必须有类型的概念,而JS没有类型的概念,因此JS用原型来实现面向对象,从而避免了类型的丢失。
3. 原型链
原型链是由原型组成的链式结构,其主要作用是实现继承。原型链的终点是Object.prototype,而Object.prototype的原型是null。原型链的查找规则如下:首先在当前对象中查找,如果未找到,则继续在其原型中查找,依此类推,直到Object.prototype的原型。如果在整个原型链上都未找到,则返回undefined。
4. 继承
继承允许子类继承父类的属性和方法。在JS中,继承是通过原型链实现的。具体来说,JS的继承有两种方式:
- 原型链继承: 子类的原型指向父类的实例,这样子类的原型就继承了父类的属性和方法。
- 构造函数继承: 在子类的构造函数中调用父类的构造函数,这样子类的实例就继承了父类的属性和方法。
5. GET 和 POST 的区别
-
协议层面: 语义上的区别。
-
应用层面:
- GET 请求的参数在URL中,请求体为空。
- POST 请求的参数在请求体中。
-
浏览器层面:
- GET 请求会被浏览器主动缓存,而POST请求则不会。
- GET 请求参数长度有限制,POST请求无此限制。
- GET 请求会被浏览器记录在历史中,POST请求则不会。
- 刷新页面时,GET请求直接刷新,而POST请求会出现提示。
6. Promise 解决了什么问题
Promise 提供了一种统一的异步实现方案,主要解决了回调地狱的问题。尽管它并没有完全消除回调地狱,也没有完全消除回调函数,但它将回调函数的嵌套改为了链式调用,使得回调更加可控。
很抱歉,我会为你恢复并格式化第七条内容:
7. Vue2 的响应式原理
Vue2 使用 Object.defineProperty() 方法来实现响应式。它会递归遍历响应式数据,将每个属性转换为 getter 和 setter 方法。当属性发生变化时,setter 方法会被触发并通知相关的依赖进行更新。但这种方式只能监听对象的属性,不能监听数组的变化。因此,Vue2 对数组的一些方法进行了重写,使其在操作时能够通知依赖更新。这些重写的方法包括:push, pop, shift, unshift, splice, sort, 和 reverse。
具体来说:
- 当
render函数在运行时使用响应式数据,这些数据会收集依赖,因此当响应式数据发生变化时,会通知watcher进行更新。 - Observer: 递归遍历响应式数据,将其转换为 getter 和 setter 方法。这发生在
beforeCreate()之后和created()之前。$add和$delete方法也会触发observer方法。 - Dep (Dependency) : 是一个依赖收集器,用于收集依赖。当响应式数据发生变化时,它会通知依赖进行更新。为响应式对象中的每一个属性、对象本身、数组本身创建一个
dep实例。dep有两个主要功能: a. 记录依赖:谁在使用这个数据。 b. 派发更新:数据发生变化时,通知使用此数据的所有依赖。 - Watcher: 是一个观察者,用于观察响应式数据的变化。当响应式数据发生变化时,
watcher会通知依赖进行更新。 - Scheduler: 是一个调度器,用于调度
watcher。当响应式数据发生变化时,它会通知依赖进行更新。
再次为丢失的数据向您表示歉意,并感谢您的耐心。
8. Vue3 的响应式原理
Vue3 通过使用 Proxy 来实现响应式。与 Object.defineProperty() 不同,Proxy 可以直接监听对象和数组的变化。当对象或数组发生变化时,Proxy 的 set 方法会被触发,并通知相关的依赖进行更新。
9. 虚拟DOM
Vue 使用虚拟DOM来提高DOM操作的效率。通过模板编译,Vue 生成 render 函数,该函数返回虚拟DOM。新旧虚拟DOM之间的差异通过 diff 算法进行比较,然后只更新差异部分,从而提高渲染效率。
本文使用 markdown.com.cn 排版