Let const var 区别:
Var
1. 存在变量提升
2. 变量可多次声明,后面的会覆盖前面的
3. 在函数中var声明变量的时候,这个变量是局部的
Let:
1. 不存在变量提升,let变量声明前这个变量不能使用
2. Let在块级作用域有效
3. Let不允许在相同的作用域中重复声明
Const:
1. const声明一个只读的变量,声明后值就不会改变
2. Const必须初始化
同步和异步的区别:
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去,同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
异步就相当于当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。项目难点and亮点:
构造函数、箭头函数和普通函数的区别:
普通函数直接调用person, 构造函数使用new关键字调用,箭头函数没有自己的this,它继承的是外围的作用域
性能优化:
避免图片src为空虽然 src 属性为空字符串,但浏览器仍然会向服务器发起一个 HTTP 请求: IE 向页面所在的目录发送请求; Safari、Chrome、Firefox 向页面本身发送请求; Opera 不执行任何操作。 还有一些框架里面自带的方法也可以调用。
Flex:
组合justify-content: flex-start; //默认值,项目位于容器的开头,justify-content: flex-end; // 项目位于容器的结尾,justify-content: center; // 项目位于容器的中间,justify-content: space-between; // 项目位于各行之间留有空白的容器内,justify-content: space-around; // 项目位于各行之前、之间、之后都留有空白的容器内。 align-items: stretch; // 默认值,项目被拉伸以适应容器
什么是EventBus
所谓事件总线模式,其实就和发布订阅模式非常类似,比如我们订阅了一个公众号,公众号发布文章之后我们就能收到信息,这就是一种订阅发布的关系。
再比如在Vue项目中,我们可以使用$on、$emit来实现事件的监听和触发,这其实就是一种事件总线的思想在里面,只不过Vue帮我们实现好了。
在我们的JavaScript中,可以给元素添加一个点击监听事件,当用户点击的时候,点击事件怎会被执行,这也是一种事件总线的思想在里面,就好比元素订阅了点击事件,用户发布或出触发点击事件。
从上可以看出,事件总线模式在我们的开发中经常出现,我们也可以通过一张图来更加清楚的认识什么是事件总线。
<script>
class EventBus {
// 定义所有事件列表,格式如下:
// {
// key: Array,
// key: Array,
// }
// Array存储的是注册的回调函数
constructor() {
this.eventObj = {}; // 用于存储所有订阅事件
}
// 订阅事件,类似监听事件$on('key',()=>{})
$on(name, callbcak) {
// 判断是否存储过
if(!this.eventObj[name]) {
this.eventObj[name] = [];
}
this.eventObj[name].push(callbcak); // 往事件数组里面push
}
// 发布事件,类似于触发事件$emit('key')
$emit(name) {
// 获取存储的事件回调函数数组
const eventList = this.eventObj[name];
// 执行所有回调函数
for (const callbcak of eventList) {
callbcak();
}
}
}
// 初始化EventBus
let EB = new EventBus();
// 订阅事件
EB.$on('key1', () => {
console.info("我是订阅事件A");
})
EB.$on("key1", () => {
console.info("我是订阅事件B");
})
EB.$on("key2", () => {
console.info("我是订阅事件C");
})
// 发布事件
EB.$emit('key1');
EB.$emit('key2');
</script>
for of 和 forEach for in的区别
- 三者都是基本的由左到右遍历数组
- forEach 无法跳出循环;for 和 for ..of 可以使用 break 或者 continue 跳过或中断。
- for ...of 直接访问的是实际元素。for 遍历数组索引,forEach 回调函数参数更丰富,元素、索引、原数组都可以获取。
- for ...of 与 for 如果数组中存在空元素,同样会执行。
vue的双向绑定原理
vue2采用的是Object.defineProperty劫持数据实现视图的双向绑定。
v-if和v-for那个优先级更高
先走v-for的逻辑,再根据v-if的条件去判断是否渲染li这个元素,如果没命中v-if的条件,则渲染一个注释节点。
原型链
每一个对象都有一个原型对象与之关联,这个原型对象它也是一个普通的对象,这个普通对象也有自己的原型对象,这样层层递进,就形成了一个链条,这个链条就是原型链,通过原型链可以实现js的继承,把父类的原型对象继承到子类的原型,这样的子类实例就可以访问父类原型上的方法了
ES5有哪些
ECMAScript 5 于 2009 年 12 月发布的,内容主要包括严格模式、JSON 对象、新增 Object 接口、新增 Array 接口和 Function.prototype.bind 等。可以认为 ECMAScript 5 规范的推出在原来没有规范的 JavaScript 语法上添加了有限的限制标准,其中最重要的一条可能就是严格模式的推出。
vuex
vuex是一个状态管理模式,他采用集中存储管理应用所有的组件状态。 这个状态管理包含以下几个部分:
- state,驱动应用数据源;
- view,以声明方式将state映射到试图上;
- actions,响应view上的用户输入导致状态变化
$root
访问根元素,语法:this.$root.属性名
v-router的两种模式
- v-router默认hash模式 使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载。hash(#)是url的锚点代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,也就是说hash 出现在 URL 中,但不会被包含在 http 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置;所以说Hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据。
- v-router可选择history模式 由于hash模式会在url中自带#,如果不想要很丑的 hash,我们可以用路由的 history 模式,只需要在配置路由规则时,加入"mode: 'history'".
vue的指令
- v-if:显示与隐藏 (创建和删除DOM元素 默认值为 false)
- v-model:多用于表单元素实现双向数据绑定
- v-for:多用于循环创建DOM元素
- v-show:显示内容 (通过修改标签上的display属性,来进行显示和隐藏)、
- v-hide:隐藏内容
- v-else-if:必须和 v-if 连用
- v-else:必须和 v-if 连用 不能单独使用 否则报错 模板编译错误
vue中自定义指令用到哪些钩子函数
- inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
- update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用
- unbind:只调用一次,指令与元素解绑时调用
描述输入url地址到网页展示的过程
- 浏览器查找域名对应的 IP 地址(DNS 查询:浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP DNS缓存 -> 根域名服务器);
- 浏览器向 Web 服务器发送一个 HTTP 请求(TCP 三次握手);
- 服务器 301 重定向(从 example.com 重定向到 www.example.com);
- 浏览器跟踪重定向地址,请求另一个带 www 的网址;
- 服务器处理请求(通过路由读取资源);
- 服务器返回一个 HTTP 响应;
- 浏览器进入 DOM 树构建;
- 浏览器发送请求获取嵌在 HTML 中的资源;
- 浏览器显示完成页面;
- 浏览器发送异步请求
v-router有几种守卫
- beforeEach:在路由改变前执行。可以访问即将进入的路由对象和目标路由对象,以及next函数。next函数用于控制路由的跳转。
- beforeResolve:与beforeEach类似,但它在beforeEach之后、路由被确认之前执行。
- afterEach:和beforeEach相反,他是在路由跳转完成后触发,参数包括to,from没有了next(参数会单独介绍),他发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫,后讲)之前。。