ES6中常见的面试题及知识点

本文详细解析了ES6中的关键概念,包括let与const的区别、模版字符串、箭头函数、默认参数、Object.assign()、Promise、模块化、class等。讨论了它们的特点、使用场景及注意事项,帮助理解ES6在前端开发中的应用。
摘要由CSDN通过智能技术生成

ES6中常见的面试题及知识点

7.1 请描述let与const以及var的区别?以及什么是暂时性死区?什么是变量提升?
  • 区别:

    • let 具有块级作用 不能重复声明 可以重复赋值
    • const 具有块级作用域 不能重复声明 不能重复赋值
    • var 全局作用域 可以重复声明 可以重复赋值
  • 暂时性死区:

    • 我个人理解,所谓的暂时性死区就是在会计作用域内使用let声明了变量,那么这个变量就不会受外部的影响,这个我把它理解为暂时性死区。
  • 变量提升:

    • 我个人理解,所谓的变量提升就是为了先事先声明变量,然后在进行赋值
7.2 请说一下你对es6的模版字符串的理解?有什么特点?
  • 我个人理解,所谓的模版字符串其实指的是我们拼接字符串的时候,是通过连接符”+”来接的,并且如果换行等需要使用转义字符,否则就会报错。这样让我们书写十分不便。所以,ES6中就引入了模板字符串,帮助我们解决这一问题,并且,在模版字符串内使用${}包裹变量,就是将声明的变量进行解析

  • 使用方式为 反单引号 可以直接插入变量 可以进行换行们不需要使用转义符号进行换行

7.3 请说一下箭头函数与普通函数的区别?
  • 普通函数是很早就提出的,而箭头函数是es6提出的,他们两个在语法上不一样,并在普通函数与箭头函数他们this的指向也不要一样,普通函数内的this指向是如果没有绑定事件元素的时候,this指向的window,或者在闭包中this指向的也是window,如果函数绑定了事件,但并没有产生闭包,这个this指向的是当前调用的事件对象,箭头函数内this的指向是父作用域

  • 箭头函数不能使用arguments,普通函数可以使用,arguments是以集合的方式获取函数传递的参数

  • 箭头函数不能实例化为构造函数,而普通函数可以进行实例化

7.4 请说一下什么是函数的默认参数?
  • 所谓的函数的默认参数其实指的就是当没有给函数参数进行传参的时候,可以给函数的形参制定默认值
7.5 请说一下Object.assign()的有什么作用
  • Object.assign()方法主要是用于将源对象复制到目标对象,Object.assign()方法有两个参数,第一个参数的表示目标对象,第二个参数表示源对象。

  • 在项目一般使用object.assign()用来对对象进行合并

7.6 请说一下你对promise的理解?并说一下promise你是如何使用的?
  • 我个人对promise的理解是,promise是异步编程的一种解决方案,他比传统的回调函数加事件更加合理和强大,目前我用promise除了使用他的异步操作外,还使用promise在项目中解决了回调地狱等问题。
  • 接下来,我在说一下promise的特点,promise一共有两个特点:
    • 对象不受外界影响,并且promise一共有三个状态,分别是进行中,成功,或者失败,只有异步操作的结果,可以决定是哪一种状态,任何其他的操作都无法改变这个状态
    • 一旦状态改变,就不会再变,任何时候都可以得到这个结果,promise的状态改变只有两种可能,要么是成功,要么失败。
  • 如果要使用promise必须还要对promise进行实例化,实例化之后promise内有一个回调函数,这个函数里面有两个参数,分别是resolve和reject,当我们的状态发生变化的时候,如果是成功则会通过resolve将成功的结果返回出去,如果失败,那么可以通过reject将错误的信息也返回出去,我们可以通过.then方法接收返回的是成功的结果,通过catch可以接受失败的结果。
  • promise常用的方法还有promise.all方法,主要是用来将多个实例包装成一个新的实例,以及promise.rece()方法
  • 那么在项目中我一般使用promise来对api接口进行封装,以及一些异步的操作,都会使用到promise
7.7 请说一下你对es6模块化的理解

在说这个es6模块化之前,我觉得我个人有必要先介绍什么是模块化,模块化开发是一种管理方式,=是一种生产方式,也可以理解为是一种解决方案,一个模块其实就是代表一个实现特定功能文件,那么在这里大家也可以理解为一个js文件就是一个模块,有了模块之后我们就可以方便的使用别人的代码,想要什么功能,就加载什么模块,但是模块开发需要一定的方案,所以后来慢慢衍生出了amd,cmd规范,不过es6也给我们提供了一种模块化的方案,分别是import和export,也就是模块的导入和导出

amd和cmd规范,其实amd规范是浏览器端的一种规范,而cmd规范是服务器端模块化的一种规范,之间amd规范的主要代表是sea.js,不过sea.js目前淘汰了,在前台开发中使用模块化的开发,我们使用的都是es6提供模块化方法,而cmd规范目前在node中我使用的cmd规范

es6模块的语法是 import export

cmd规范的语法是 require("") module.export

7.8 请说一下 es5与es6的区别?
  • es5其实指的是ecmascript第五个版本

  • es6其实指的是ecmascript第六个版本

  • es6在es5的基础上新增了很多的新特性

7.9 请说一下使用箭头函数应该要注意什么?

箭头函数没有自己的this

箭头函数不能使用arguments,普通函数可以使用,arguments是以集合的方式获取函数传递的参数

箭头函数不能实例化为构造函数,而普通函数可以进行实例化

7.10 请说一下es6有哪些新增的特性?
  • 变量的声明方式,分别是let与const

  • 变量的解构赋值

  • 增加了一些字符串与数组的方法,比如:模版字符串,includes方法,startsWith方法,endsWith方法,还是其他等等,数组方法有map方法,filter方法,foreach方法,find方法,findindex()方法

  • 增加了symbol类型

  • 箭头函数,函数参数默认值

  • promise

  • 模块化

  • class类

  • async await

  • set和map数据结构

  • 正则

7.11 请说一下你对es6 class类的理解?

所谓的class类其实就是es5构造函数的语法糖,所谓的语法糖其实就是构造函数的另外一种写法而已

7.12 请说一下Promise 中reject 和 catch 处理上有什么区别
  • reject 是用来抛出异常,catch 是用来处理异常

  • reject 是 Promise 的方法,而 catch 是 Promise 实例的方法

  • reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch

  • 网络异常(比如断网),会直接进入catch而不会进入then的第二个回调

7.13 请说一下什么是深拷贝,什么是浅拷贝?以及如何实现深拷贝与浅拷贝?用es6如何实现深拷贝?

自己总结

7.14 举一些ES6对String字符串类型做的常用升级优化?
  • 优化部分:
    • ES6新增了字符串模板,在拼接大段字符串时,用反斜杠()`取代以往的字符串相加的形式,能保留所有空格和换行,使得字符串拼接看起来更加直观,更加优雅
  • 升级部分:
    • ES6String原型上新增了includes()方法,用于取代传统的只能用indexOf查找包含字符的方法(indexOf返回-1表示没查到不如includes方法返回false更明确,语义更清晰), 此外还新增了startsWith(), endsWith(), padStart(),padEnd(),repeat()等方法,可方便的用于查找,补全字符串
7.15 举一些ES6对Array数组类型做的常用升级优化?

ES6Array原型上新增了find()方法,用于取代传统的只能用indexOf查找包含数组项目的方法,且修复了indexOf查找不到NaN的bug([NaN].indexOf(NaN) === -1).此外还新增了copyWithin(),includes(), fill(),flat()等方法,可方便的用于字符串的查找,补全,转换等

7.16 Map是什么,有什么作用?

MapES6引入的一种类似Object的新的数据结构,Map可以理解为是Object的超集,打破了以传统键值对形式定义对象,对象的key不再局限于字符串,也可以是Object。可以更加全面的描述对象的属性

7.17 Set是什么,有什么作用?

SetES6引入的一种类似Array的新的数据结构,Set实例的成员类似于数组item成员,区别是Set实例的成员都是唯一,不重复的。这个特性可以轻松地实现数组去重

7.18 Proxy是什么,有什么作用?

ProxyES6新增的一个构造函数,可以理解为JS语言的一个代理,用来改变JS默认的一些语言行为,包括拦截默认的get/set等底层方法,使得JS的使用自由度更高,可以最大限度的满足开发者的需求。比如通过拦截对象的get/set方法,可以轻松地定制自己想要的key或者value。下面的例子可以看到,随便定义一个myOwnObjkey`,都可以变成自己想要的函数

7.19 Class、extends是什么,有什么作用?

ES6class可以看作只是一个ES5生成实例对象的构造函数的语法糖。它参考了java语言,定义了一个类的概念,让对象原型写法更加清晰,对象实例化更像是一种面向对象编程。Class类可以通过extends实现继承。它和ES5构造函数的不同点

7.20 常前端代码开发中,有哪些值得用ES6去改进的编程优化或者规范?
  • 常用箭头函数来取代var self = this;的做法。

  • 常用let取代var命令。

  • 常用数组/对象的结构赋值来命名变量,结构更清晰,语义更明确,可读性更好

  • 在长字符串多变量组合场合,用模板字符串来取代字符串累加,能取得更好地效果和阅读体验

  • Class类取代传统的构造函数,来生成实例化对象

  • 在大型应用开发中,要保持module模块化开发思维,分清模块之间的关系,常用importexport方法。

7.21 什么是 Babel?

Babel 是一个 JS 编译器,自带一组 ES6 语法转化器,用于转化 JS 代码。

  • 这些转化器让开发者提前使用最新的 JS语法(ES6/ES7),而不用等浏览器全部兼容

  • Babel 默认只转换新的 JS 句法(syntax),而不转换新的API。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值