做为前端开发,应该都知道,ES6是我们必学的,而之所以强调ES6,是因为在ES6那个版本增加了很多东西,以至于阮一峰大佬还写了本书,也因此,我们经常会在面试里面被问到,你了解ES6吗,知道哪些新特性,而在你说出来之后,就会引来一系列的问题,这篇博客就从我面试bat字节时被问到的一些问题和网上的面经结合做一些总结和问题的回答,同时也会谈到如何从被问的问题里面“引导”面试官去问你其他的问题
新增声明符let const
我们知道,在ES6里面,多了两个声明符,let和const,如果你提到了这个,那么可能会面临下面的问题
var let const三者的区别
作用域的区别
var声明的变量可以在全局作用域,函数作用域和严格模式下的eval作用域里使用,而let和const多了个块级作用域,在if、else、while、for循环的{}里声明的变量,无法在该{}外部使用(这里提到作用域也许会让面试官问到作用域嵌套,当然你也可以自己刻意提起,比如可以说在函数作用域里声明的变量,虽然是被嵌套在另一个函数作用域或者全局作用域里面,但无法使用这个变量,而相对的在函数作用域里面可以使用嵌套它的作用域里声明的变量)
变量提升
var声明的变量有变量提升的特点,在声明一个变量时变量会被提升到文件顶部,所以我们可以使用后面var声明的变量,但是此时变量的值为undefined,而let和const,因为没有变量提升,所以如果在声明前使用的话会引起报错
变量是否可变
这个是关于const声明的变量的特性,是面试中经常被问到的(反正我在面腾讯百度字节都被问到了),const声明的变量不能被重新赋值,如果重新赋值,就会报错,提到这个问题时,就会引出下面的问题
- const声明的对象,对象的属性可以改变吗:可以,const声明的对象,不能重新赋值,但其对象的属性是可以变化的,我的理解是,const声明的变量不能改变,是指这个变量指向内存中哪一段内容不能变,而对于对象来说,我们的变量存储的是一个地址,表示对象在内存中,在堆中所处的位置,而对象的属性改变,并不会改变这个指向
- 如何让声明的对象的属性也不能被改变:我自己想到的方法有:proxy代理,Object.defineProperty劫持set操作,Object.freeze,可能还有别的方法,但我当时只回答了这些
箭头函数
箭头函数在ES6时被提出,现在也被广泛运用到开发中,但如果没有好好地去了解它,那么开发时也可能会踩到莫名其妙的坑
箭头函数和一般函数的区别
this指向
箭头函数的this,指向了其执行时所在的作用域,而一般函数的this指向,要考虑到是否用到new构造,是否用到了apply,call,bind来进行this的指向修改
- 问到了这个问题,一般就会问到了apply,call,bind的区别了,包括this的四种指向的情况,这个可以在《你不知道的JavaScript》里面看,我觉得挺详细的,当然网上也有很多介绍详细的文章了,这里不做赘述
不能使用apply,call,bind
这个也是上面提到的了,因为箭头函数的this是其执行时所在的作用域,所以也无法同个apply,call,bind来改变this指向
- 这里说一下,你可以直接在这里顺便说一下apply,call,bind三者的区别,让面试官知道你这方面也是了解的,而此外,你也可以提提这三者哪个的性能比较好,这个我也做过了测试,所以在面试的时候我也会说出来,自己测试过这三个的性能,哪个比较好,感觉会留下比较好的印象,至少你有去多做考虑,而不是只会用,详见我之前写的博客JavaScript辨别apply,call,bind 用法与性能
无法使用arguments对象
一般的函数如果我们传入的参数个数是不定的话,那么可以通过arguments对象来列出所有传入的参数,而箭头函数却不能使用这个对象,但是,我们可以使用扩展运算符来代替arguments对象
不能使用yield命令
箭头函数不能使用yield命令,因此箭头函数不能使用generator函数(这个回答的话可以考虑是否回答,如果你对generator函数并不是很了解,那就可以不说,不然面试官可能会问你相关的知识,别问我为什么知道的。。。)
没有prototype属性,无法通过new来构建实例
箭头函数没有prototype属性,而我们知道,new构建实例时除了需要对this的指向进行指定,还要让实例对象继承该方法的原型,所以箭头函数也就无法使用new来构建实例
箭头函数的优点
要说箭头函数的优点,我也没有准确的答案,我就发表一下我个人的观点
- 写的时候比较比较便利,虽说function这个单词也不难写,但是显然,直接用()=>{}的写法会更快
- 相对代码体积比较小,在很小的程度上有一点性能的提高
(实际上这点提高可能在写的函数特别多的时候会有感觉,但一般我其实觉得还是没什么大影响,而且虽说现在浏览器大多支持箭头函数语法,但是我们在写的时候一般还是会通过babel进行一个编译,所以实际上这个优点有点牵强,但是只说一点又好像不太好,总之这种问题就是言之有理即可,尽