ECMAScript6面试题

1.请描述letconst以及var的区别?以及什么是暂时性死区?什么是变量提升?

区别:

let 具有块级作用 不能重复声明 可以重复赋值
const 具有块级作用域 不能重复声明 不能重复赋值
var 全局作用域 可以重复声明 可以重复赋值

暂时性死区:

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

变量提升:

个人理解,所谓的变量提升就是为了先事先声明变量,然后在进行赋值

2.请说一下你对es6的模版字符串的理解?有什么特点?

个人理解,所谓的模版字符串其实指的是我们拼接字符串的时候,是通过连接符 ”+” 来接的,并且
如果换行等需要使用转义字符,否则就会报错。这样让我们书写十分不便。所以, ES6 中就引入了
模板字符串,帮助我们解决这一问题,并且,在模版字符串内使用 ${} 包裹变量,就是将声明的变
量进行解析
使用方式为 反单引号 可以直接插入变量 可以进行换行们不需要使用转义符号进行换行

3.请说一下箭头函数与普通函数的区别?

普通函数是很早就提出的,而箭头函数是 es6 提出的,他们两个在语法上不一样,并在普通函数与
箭头函数他们 this 的指向也不要一样,普通函数内的 this 指向是如果没有绑定事件元素的时候, this
指向的 window ,或者在闭包中 this 指向的也是 window ,如果函数绑定了事件,但并没有产生闭
包,这个 this 指向的是当前调用的事件对象,箭头函数内 this 的指向是父作用域 .箭头函数不能使用arguments ,普通函数可以使用, arguments 是以集合的方式获取函数传递的参 数
箭头函数不能实例化为构造函数,而普通函数可以进行实例化

4.请说一下什么是函数的默认参数?

所谓的函数的默认参数其实指的就是当没有给函数参数进行传参的时候,可以给函数的形参制定默 认值

5,请说一下Object.assign()的有什么作用 ?

Object.assign() 方法主要是用于将源对象复制到目标对象, Object.assign() 方法有两个参数,第一 个参数的表示目标对象,第二个参数表示源对象。
在项目一般使用 object.assign() 用来对对象进行合并

6.请说一下你对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.请说一下你对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

8.请说一下 es5es6的区别?

es5 其实指的是 ecmascript 第五个版本
es6 其实指的是 ecmascript 第六个版本
es6 es5 的基础上新增了很多的新特性

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

1.箭头函数没有自己的this对象

(1)普通的函数,this指向的是事件源本身,如果内部有嵌套,this的指向就会发生转移

(2)箭头函数,this指向的是调用该函数的对象(this的指向是静态的)

2、箭头函数不可以当作构造函数,即不可以对箭头函数使用new命令,否则会抛出一个错误

3、不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以用reset参数代替

4、不可使用yield命令,因此箭头函数不能用作Generator函数


10.请说一下es6有哪些新增的特性?

变量的声明方式,分别是 let const
变量的解构赋值
增加了一些字符串与数组的方法,比如:模版字符串, includes 方法, startsWith 方法 ,endsWith
法,还是其他等等,数组方法有 map 方法, filter 方法, foreach 方法, find 方法, findindex() 方法
增加了 symbol 类型
箭头函数,函数参数默认值
promise
模块化
class
async await
set map 数据结构
正则表达式

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

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

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

在了解浅拷贝和深拷贝之前,我们先了解一下js的数据类型
js的数据类型分为两种
一种是基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)
一种是引用数据类型:对象(Object)、数组(Array)、函数(Function)


基本类型的变量是存放在栈内存,引用数据类型是放在堆内存中的,基本数据类型保存的是值,而引用数据类型一般保存的是对象的地址。
如果我们单纯的复制的话,可能就只是复制对象的地址,那么这就是浅拷贝,如果是克隆了对象,改变了引用对象的地址,那么就是深拷贝


浅拷贝就是拷贝指向对象的指针
深拷贝就是克隆了对象,并重新在堆中指向了一个新的地址
只有引用数据类型才存在浅拷贝和深拷贝,基本数据类型就是赋值

浅拷贝和深拷贝的区别是:看复制的子对象是否在堆内存中指向一个新的地址

实现一个深拷贝实现思路:

  1. 检查类型,判断类型是否为引用类型,是就进行深拷贝,否则浅拷贝
  2. 使用递归
  3. 检查环,判断当前引用是否指向自身,避免进入死循环
  4. 需要忽略原型

快捷深拷贝的方法

通过序列化和反序列化得到一个新的对象,JSON.parse(JSON.stringify(a));缺点:会忽略 Function、Symbol、undefined,造成属性丢失,如果在知道深拷贝对象的类型中不含有这些类型的话,这个方法还是相当的好用。
第三方工具:jquery 提供一个$.extend可以用来做深拷贝,lodash函数库提供的_.cloneDeep也可以用来做深拷贝

13.举一些ES6String字符串类型做的常用升级优化?

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

14.举一些ES6Array数组类型做的常用升级优化?

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

15.Map是什么,有什么作用?

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

16.Set是什么,有什么作用?

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

17.Proxy是什么,有什么作用?

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

18.Classextends是什么,有什么作用?

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

19.常前端代码开发中,有哪些值得用ES6去改进的编程优化或者规范?

常用箭头函数来取代 var self = this ; 的做法。
常用 let 取代 var 命令。
常用数组 / 对象的结构赋值来命名变量,结构更清晰,语义更明确,可读性更好
在长字符串多变量组合场合,用模板字符串来取代字符串累加,能取得更好地效果和阅读体验
Class 类取代传统的构造函数,来生成实例化对象
在大型应用开发中,要保持 module 模块化开发思维,分清模块之间的关系,常用 import
export 方法。

20.什么是 Babel?

Babel 是一个 JS 编译器,自带一组 ES6 语法转化器,用于转化 JS 代码。
这些转化器让开发者提前使用最新的 JS 语法 (ES6/ES7) ,而不用等浏览器全部兼容
Babel 默认只转换新的 JS 句法 (syntax) ,而不转换新的 API

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值