不熟悉的

138 阅读6分钟

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的两种模式

  1. v-router默认hash模式 使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载。hash(#)是url的锚点代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,也就是说hash 出现在 URL 中,但不会被包含在 http 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置;所以说Hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据。
  2. 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地址到网页展示的过程

  1. 浏览器查找域名对应的 IP 地址(DNS 查询:浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP DNS缓存 -> 根域名服务器);
  2. 浏览器向 Web 服务器发送一个 HTTP 请求(TCP 三次握手);
  3. 服务器 301 重定向(从 example.com 重定向到 www.example.com);
  4. 浏览器跟踪重定向地址,请求另一个带 www 的网址;
  5. 服务器处理请求(通过路由读取资源);
  6. 服务器返回一个 HTTP 响应;
  7. 浏览器进入 DOM 树构建;
  8. 浏览器发送请求获取嵌在 HTML 中的资源;
  9. 浏览器显示完成页面;
  10. 浏览器发送异步请求

v-router有几种守卫

  1. beforeEach:在路由改变前执行。可以访问即将进入的路由对象和目标路由对象,以及next函数。next函数用于控制路由的跳转。
  2. beforeResolve:与beforeEach类似,但它在beforeEach之后、路由被确认之前执行。
  3. afterEach:和beforeEach相反,他是在路由跳转完成后触发,参数包括to,from没有了next(参数会单独介绍),他发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫,后讲)之前。。