ES6面试题

237 阅读1分钟

1、es5和es6的区别,说一下你所知道的es6

ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化

ECMAScript6,即ES6,是ECMAScript的第六次修订,于2015年开发完成,也称ES2015

ES6是继ES5之后的一次改进,相对于ES5更加简洁,提高了开发效率

ES6中新增的一些特性

  • let声明变量和const声明变量,两个都有块级作用域(var没有块级作用域) ES5中是没有块级作用域的,并且var有变量提升,在let中,使用的变量一定要进行声明

  • 箭头函数 ES6中的函数定义不在使用关键字function(),而是利用了()=>来进行定义

  • 模板字符串==>(${}) 模板字符串是增强版的字符串,用反引号(`)标识,可以当作普通字符串使用,也可以用来定义多行字符串

  • 解构赋值 ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值

  • for of 循环 for...of循环可以遍历数组、Set和Map解构,某些类似数组的对象、对象,以及字符串

  • import/export导入导出 ES6标准中,Js原生支持模块(module).将JS代码分割成不同功能的小块进行模块化,将不同功能的代码分别写在不同文件中,各模块只需导出公共接口部分,然后通过(模块的导入)的方式可以在其他地方使用

  • Set数据结构 Set数据结构,类似数组。所有的数据都是唯一的,没有重复的值,它本身是一个构造函数

  • ...ary(...展开符) 可以将数据或对象里面的值展开;还可以将多个值收集为一个变量

  • class类的继承 ES6中不再像ES5一样使用原型链实现继承,而是引入Class这个概念

  • async、await 使用async/await,搭配Promise,可以通过编写形似同步的代码来处理异步流程,提高代码的简洁性和可读性

async用于申明一个function是异步的,而await用于等待一个异步方法执行完毕

  • promise Primise是异步编程的一种解决方案,比传统的解决方案(回调函数和是事件)更合理,更强大

  • Symbol Symbol是一种基本类型。Symbol通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的

  • Proxy代理 使用代理(Proxy)监听对象的操作,然后可以做一些相应事情

2、var let const 之间的区别

  • var声明变量可以重复声明,而let不可以重复声明
  • var是不受限于块级的(没有块级作用域),而let和const是有块级作用域的
  • var会与window相映射(会挂一个属性),而let不会
  • var可以在声明的上面访问变量,而let有存暂死区,在声名的上面访问会出错
  • const声明之后必须赋值,否则会报错
  • conts定义不可变的量,改变了就会报错
  • const和let一样不会与window相映射,支持块级作用域,在声明的上面访问变量会报错

3、es6实现代码数组去重的方式

  • ...new Set() 一行代码就可以数组去重

4、使用箭头函数应该注意什么

  • 箭头函数是匿名函数,不能作为构造函数,不能用new
  • 用了箭头函数,this就不是指向window,而是父级(指向是可变的)
  • 箭头函数没有原型属性
  • 不可以使用arguments对象,该对象在函数体内不存在

5、ES6的模板字符串有哪些新特性?并实现一个类模板字符串的功能

  • 基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定
  • 在ES5中通过反斜杠()来做多行字符串或者字符串一行行拼接.
  • ES6中用反引号(`)就可以解决
let name = '小明';
        let age = 10;
        let str = '你好,${name} 已经 ${age}岁了'
        str = str.replace(/${([^}]*)}/g,function(){
            return eval(arguments[1]);
        })
        console.log(str);//你好,小明 已经 10岁了

6、介绍下Set和Map的区别?

  • 应用场景不同:Set用于数据重组,Map用于数据存储
  • Set中成员不能重复,只有键值没有键名,类似数组,可以遍历,方法有add,delete,has
  • Map本质上是键值对的集合,类似集合,可以遍历,可以跟各种数据格式转化

7、Promise是什么?有几种状态,什么时候会进入catch?

promise是异步编程的一种解决方案,用来解决异步操作问题

promise有三个状态:pedding(进行中),fulfilled(成功),rejected(失败)

promise有两个过程:pedding=>fulfilled、pedding=>rejected

当pedding为rejected时,会进入catch

8、Promise构造函数是同步执行还是异步执行

promise构造函数是同步执行的,then方法是异步执行的

9、Promise中reject和catch处理上有什么区别

  • reject是用来抛出异常的,catch是用来处理异常
  • reject是Promise的方法,而catch是Promise实例的方法
  • reject后的东西,一定会进入到then中的第二个回调,如果then中没有第二个回调,则进入catch
  • 网络异常(比如断网),会直接进行catch而不会进入then的第二个回调

10、如何使用Set数组去重

let arr = [12,43,23,43,68,12];
let item = [...new Set(arr)];
console.log(item);//[12, 43, 23, 68]

11、将下面for循环改成for..of的形式

let arr = [11,22,33,44,55];
let sum = 0;
for(let i=0;i<arr.length;i++){
    sum += arr[i];
}

答案如下:

let arr = [11,22,33,44,55];
let sum = 0;
for(value of arr){
    sum += value;
}

12、讲一下forEach、for in、for of三者的区别

  • forEach更多的是用来遍历数组
  • for in一般是用来遍历对象或json
  • for of数组、对象都可以遍历,遍历对象要通过Object.keys()
  • for in循环出来的是key,for of循环出来的是value

13、说一下es6的导入和导出

  • 使用export default时,对应的import语句不需要使用大括号
  • 不适用export default时,对象的import 语句需要使用大括号

14、axios的特点有那些?axios拦截器

axios是一个基于promise的http库,支持promise所有的api

它可以拦截请求和响应

它可以转换请求数据和响应数据

安全性更好

常用方法有:axios.get axios.delete axios.post axios.put

15、axios和ajax的区别

ajax

 $.ajax({
    url: '接口地址',
    type: 'get', //或者post   请求类型
    dataType: 'json',
    data: { // 要发送的请求参数
      'username' : 'hermit',
      'password' : 'a123'
    },
    success : function (response) {
      console.log(response); // 请求返回的数据
    }
  })

axios

 axios({
    url: '接口地址',
    method: 'get', //或者 post    请求类型
    responseType: 'json', //默认格式,如果就是 json 格式可以不写
    data: {
      'username' : 'hermit',
      'password' : 'a123'
    }
  }).then( function(response){ // 请求正确返回的数据
    console.log(response);
    console.log(response.data);
  }).catch( function(error) { // 请求错误返回的数据
    console.log(error);n  
  })

两者其实并没有太大的区别,在写法上大致相同 其实axios就是通过promise实现对ajax技术的一种封装