1.关于利用数组去重的方法,除了用最简单的set去重以外, 还有reduce,先来看一下reduce的基本使用吧

 那么问题来了, 如何用reduce来给类数组对象去重呢?

 2.promise是用来做什么的? 

promise是用来解决异步编程问题(简单说是就是解决回调地狱的),

promise有三种状态:   padding(等待状态) ,    resolve(成功状态) .    reject(失败状态)

如何用promise来实现同步操作?

这里大家记住promise 有一个语法糖, async  await   在promise中添加async, await就能实现同步操作

3.什么是原型链? 

当访问一个对象的某个属性时,会先在这个对象本身属性上查找, 如果没有找到,则会去它的__proto__隐式原型上查找, 即它的构造函数的prototype,如果还没有找到就会再再构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,这就是原型链

4.闭包?

闭包,通俗的来说,就是在当前作用域能访问到外部作用域中的对象。实际上,闭包的存在是为了保护私有变量不被污染,形成不销毁的栈内存,里面的私有变量等信息保存下来。

5.watch和computed的区别?

computed是计算属性, 它是基于响应式依赖进行缓存的,如果依赖不变的话, 就会变成缓存, computed就不会重新计算

watch 是监听数据状态,只有在状态发生改变时才会触发(当有一些数据需要随着其他数据变动而变动时, 或者当需要在数据变化时执行异步或开销较大的操作时)

6.scoped的原理?(解决了组件之间样式的覆盖问题,当别的组件中需要用到这个组件里的样式的时候, 可以用/deep/穿透来)

会在当前组件的模板上添加一个data-v -xxx

后续配合属性选择器查找添加样式, 不会让样式污染,

让每个组件的样式不会互相冲突

lang="scss" 改变css样式的编译方式 换成scss语法 (可以进行嵌套使用)

/deep/ >>> 穿透, 可以让样式在别的vue文件中使用,

scoped看起来很美,但是,在很多项目中,会出现这么一种情况,即:引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成组件之间的样式污染。此时只能通过特殊的方式,穿透scoped。

7.SPA单页应用?与多页应用的区别?

SPA单页应用是由一个页面和多个组件片段组成的, 采用路由懒加载, 当需要的时候再加载页面, 

优点: 1.用户体验好, 2, 前后端分离 3. 后期维护方便4.专场动画容易实现5.页面局部刷新

缺点: 1.开发成本高2.不利于SEO搜索

8.vuex和localstorage . cookie的区别?

vuex是为了解决多组件之间的共享状态的一种状态管理模式, 强调集中式管理, 将所有的共享状态放在内存中, 读取速度快, 但是页面一刷新就恢复默认值了,

vuex的五大核心: state(存放数据的地方) , actions(发送异步请求) getters(类似于computed计算属性), mutations(更改状态的地方), modules(组件模块化) 

其中, 更改状态只能在mutations中,是同步请求, 通过commit来更改, 发送异步请求要在actions里面,组件通过dispath来触发    

vuex有四个辅助函数:   mapGetters. mapActions . mapMutations. mapState

localstorage是永久性存储, 存在本地中,只要不主动删除就会一直存在

cookie储存的信息比较少, 只有4KB 它有有效时间, 过期会自动删除

9.元素隐藏的区别?

visibility:hidden;隐藏占位                  display:none;隐藏不占位

10.axios的交互?

axios是一个基于Promise的HTTP库, 支持promise所有的API,支持请求/响应拦截器,

11.H5新增的特性?

1,标签: header. footer. active,nav, aside, 

2,画布: canvas 

3.audio, video

4. localstorage,   sessionstorage

5. 新的表单元素(tel.date,time,email,url)

12.CSS3新特性?

1.border-radius

2.box-shadow . text-shadow

3.transform: translate()  . scale(), skew() rotate()

4.动画:  @keyframs    animation()

5.媒体查询   @media

13.gulp和webpack的理解?

相同点: 都是自动化构建工具

不同点: gulp 是基于流的自动化构建工具, 通常以管道的方式,通过.pipe给下一个流程,强调工作流程

webpack是模块化打包工具, 可以借助它将模块化的资源转为一个或多个js文件, 强调模块化 all in module

14.谷歌和IE的兼容问题

1.表单的归类

ie下的表单元素在设置了disabled禁用属性之后,在ie下点击,仍然会有焦点。谷歌这是正常的没有焦点

解决方法:给表单元素设置增加属性 unselectable='on' 即可。

2.阻止冒泡事件

IE: e.cancelBubble = true

W3c: e.stopPropagation()

3.阻止默认行为

以a链接为例 点击会有默认跳转行为

W3c: e.preventDefault()

IE: returnValue = false

15.ES6新特性?

1. let const

let 表示申明变量。const 表示申明常量。

  • 常量定义了就不能改了。对象除外,因为对象指向的地址没变。
  • const在申明是必须被赋值。
  • 两者都为块级作用域。

块级作用域与函数作用域。任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。函数作用域就好理解了,定义在函数中的参数和变量在函数外部是不可见的。

const a = 1
a = 0 //报错

2. 模块字符串``

可以使用反引号``来进行字符拼接。${}

3. 解构

可以使用{}来对数组和对象进行解构。

4. 函数的参数默认值

函数传参可以有默认值

// ES6;
function printText(text = 'default') {
    console.log(text);
}

5. Spread / Rest 操作符...

Spread / Rest 操作符指的是 ...,具体是 Spread 还是 Rest 需要看上下文语境。

  • 当被用于迭代器中时,它是一个 Spread 操作符:迭代器 (Iterator)是按照一定的顺序对一个或多个容 器 中的元素行进遍历的一种机制
function foo(x,y,z) {
  console.log(x,y,z);
}
 
let arr = [1,2,3];
foo(...arr); // 1 2 3
  • 当被用于函数传参时,是一个 Rest 操作符:当被用于函数传参时,是一个 Rest 操作符:
function foo(...args) {
  console.log(args);
}
foo( 1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]

6. 箭头函数

  • 不需要 function 关键字来创建函数
  • 省略 return 关键字
  • this始终指向函数申明时所在作用域下的this值
//es5
var fun = function() {

}
//es6
var fn = () => {

}

7. for of

  • for of遍历的是键值对中的值
  • for in遍历的是键值对中的键

8. class类

ES6 中支持 class 语法,不过,ES6的class不是新的对象继承模型,它只是原型链的语法糖表现形式。

class Student {
  constructor() {
    console.log("I'm a student.");
  }
 
  study() {
    console.log('study!');
  }
 
  static read() {
    console.log("Reading Now.");
  }
}
 
console.log(typeof Student); // function
let stu = new Student(); // "I'm a student."
stu.study(); // "study!"
stu.read(); // "Reading Now."

9. 导入导出

  • 导入improt
  • 导出export default

10. promise

Promise 用于更优雅地处理异步请求。

  <script>
    new Promise((resolve,reject) => {
      setTimeout(function() {
        resolve('成功了!')
      },1000)
      // reject("失败了,wuwu")
    }).then(data => {
      console.log(data)
    }).catch(err => {
      console.log(err)
    })
  </script>

11. async/await

比promise更好的解决了回调地狱。

async function() {
  awiat fn()
}

12. Symbol

新的符号基本类型

13. Set集合

存储任何类型的唯一值,即集合中所保存的元素是不重复的。类数组结构。

arr = [1,2,3,1]
let arrNew = new Set(arr)
arrNew = [1,2,3]

类数组不是数组,要转化为数组Array.form(arrNew)这样arrNew才是数组了

16.数组常用的方法,以及Es6新增的数组方法?

数组方法(会不会改变原数组)_zhanggei的博客-CSDN博客_会改变原数组的数组方法 可以访问这个链接地址,里面有详细的讲解。

17.vue获取token的登录过程?

vue获取token登录的过程:
1,访问需要登录的页面的时候,利用路由守卫跳转,输入正确的用户名密码 向后台的认证接口发送数据
2,获取token 用vuex存储 ,且存储到localstorage中,关闭页面,下次重新访问可不用登陆,直接从localstorage取值,token过期时间由后台控制
3,axios 拦截 设置接下来的接口访问带着token;当token过期返回401跳转登陆重新获取token进行登录,

18.vue 生命周期
链接地址:vue的生命周期_zhanggei的博客-CSDN博客

19.v-for 和v-if的优先级问题?能不能一块用?

不能一块用, v-for的优先级要比v-if的高,一般真要用的话也不再一块写,可以父子结构上写,避免因为一块用引起的消耗高内存。

20.基本数据类型?

String .Number. Boolean.Undefined.Null.Object .

Object里面有Array。Function 

Es6新增的Symbol(符号类型)唯一性。

面试八股文

链接:https://juejin.cn/post/7016593221815910408
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐