1.Symbol
ES6引入的一种新的原始数据类型,其特点是表示第一无二的值,Symbol最大的用途是定义对象的唯一属性名。比如要给一个已有属性添加一个新的属性,新的属性可能与旧的属性名冲突,这个时候采用Symbol是最好的。
需要注意的是Symbol不是一个构造函数,所以不能用new关键字;
Symbol函数的参数只是对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的;
Symbol值不是对象,所以不能添加属性;
Symbol值不能与其他类型的值做运算;
在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号中;Symbol值作为对象属性名时,不能用点运算符。
用Symbol值定义的对象属性用普通方法遍历不到,需要用Object.getOwnPropertySymbols()
2.数组去重
方法1:利用for循环和indexOf找下标的方法去重
思路:先定义一个空数组,然后用for循环遍历原数组中的每一个元素,通过indexOf方法判断当前元素在不在新数组中,如果不存在,就用push方法添加。
方法2:ES6 Set方法去重,然后用扩展运算符...或者Array.from返回
方法3:Object键值对去重;将已经出现过的元素当做属性名,存入一个object内
先定义一个空数组和一个空对象,遍历元素中的每一个元素,判断obj中的arr[i]属性有没有值,没有的话,把这个元素添加到新数组,把属性放入object中并赋值,最后返回新数组。这种方法占用内存很多,牺牲了大量空间。
如何理解前端模块化?
前端的模块化就是将复杂的文件编程一个一个独立的模块,比如JS文件,分成独立的模块有利于重用和维护,但是这样会有模块之间相互依赖的问题,所以就有了commonJS规范,AMD/CMD规范,还有ES6模块化规范,以及用于js打包的工具webpack.
什么是回调地狱?如何解决回调地狱问题?
多层回调函数的相互嵌套,就形成了回调地狱。它使代码难以维护,可读性变差。
为了解决回调地狱的问题,ES6提出了Promise的概念。Promise是一个构造函数,它可以创建一个Promises实例对象。它的原型上包含一个.then()的方法,.then()方法可以预先指定成功和失败的回调函数。如果上一个.then()方法返回一个新的Promise实例对象,则可以通过下一个.then()继续处理,就解决了回调地狱的问题。(Promise异步编程的解决方案)
.then()链式调用的的缺点:代码冗余,阅读性差,不易理解。
Promise和async/await的关系:都是异步编程的解决方案,async/await简化了Promise的异步操作