面向对象
对象
万物皆对象。
定义:js中一组无序的相关属性和方法的集合
类
把公共方法、行为抽离出来,组成一个模板(类),通过实例化,继承类的方法和行为
ES6和JS的关系:是JS的规范,扩展新特性。
Es6新特性
const ,let , promise, class , filter, forEach, call, bind, apply,解构赋值, 浅拷贝:Object.assign(),
箭头函数, 扩展运算符, 模板字符串, Array.from( ), new Set( )、Map
Object.assign会合并对象生成一个新对象。如果对象的属性是普通类型改变,之后新对象不会改变,如果是引用类型改变后新对象也会改变,所以Object.assign实际上还是浅拷贝。
var obj={aa:1,b:{item:'45'}};
var newObj=Object.assign({},obj);
obj.aa=2;
obj.b.item='kk';
console.log(newObj.aa); //1
console.log(newObj.b.item); //kk
谈谈你对ES6的理解
es6是一个新的标准,它包含了许多新的语言特性和库,是JS最实质性的一次升级
比如箭头函数
、字符串模板
、generators(生成器)
、async/await
、解构赋值
、class
等等,还有就是引入module
模块的概念
async和await的优缺点
async
和 await
相比直接使用 Promise
来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码。缺点在于滥用 await
可能会导致性能问题,因为 await
会阻塞代码,也许之后的异步代码并不依赖于前者,但仍然需要等待前者完成,导致代码失去了并发性
promise解决了什么问题,为什么会出现promise
- 解决的问题
promise解决了回调地狱问题,回调地狱指的就是异步的嵌套,它带来两个问题:可读性问题和信任问题
- promise优缺点
(1)优点:
让回调函数变成了规范的链式写法,程序流程可以看的很清楚。他有一整套接口,可以实现许多强大的功能,比如同时执行多个异步操作,等到他们的状态都改变以后,在执行一个回调函数;再比如,为多个回调函数中抛出的错误,统一制定处理方法…
有一个传统写法没有的好处:他的状态一旦改变,无论何时查询,都能得到这个状态。这意味着无论何时为peomise实例添加回调函数,该函数都能正确执行。
传统写法的话都通过监听事件来执行回调函数,一旦错过了事件,再添加回调函数是不会执行的。
2)缺点:
编写的难度比传统写法高,而且阅读代码也不是一眼可以看懂。你只会看到一堆then,必须自己在then的回调函数里面理清逻辑。
为什么会出现生成器这个东西
生成器是一种可以用来控制迭代器(iterator)的函数,它可以随时暂停,并可以在任意时候恢复。就是可以再函数外部控制函数内部的执行
变量的解构
数组
1、等号两边的模式相同,也就是说对象的结构一样,(具有 length 属性的数据类型都 可以解构)
2、如果等号左边出现…,那么从…之前的一个变量往后所有的值都会放入一个数组
3、解构不成功全部为 undefined
4、数组解构时,等号右边必须为数组,任何类型的数据都会报错,(除字符串, arguments)
5、数组结构的默认值:只有数组成员严格等于 undifined 时默认值才会生效,否则不 生效, null === undifined 不成立
6、 默认值如果为函数,进行惰性求值,只有 undifined 进行使用默认值时,才会调用 函数
对象
1、对象的解构其实是模式的查找然后给对应的变量赋值,变量随便写,与模式无关, 且跟属性的顺序无关
2、变量的声明和赋值是一体的。必须同时进行
3、如果变量先定义,后赋值,在模式正确的情况下,用小括号进行包裹,此时赋值成 功;如果模式有歧义,es6 不建议用小括号
4、对象的嵌套解构,什么为模式,什么为赋值,对象从外层向内逐层解构
5、对象解构的默认值:只有对象的属性值严格等于 undifined 时默认值才会生效,否 则不生 效,null===undifined 不成立;
6、默认值的惰性求值;
其他
(1)数组解构为对象(特殊的对象),解构时,解析的模式为数组的下标;
(2)字符串解构为数组:首先把字符串转换为类数组的形式进行解构;
(3)数值和布尔值的解构,右边先转换为对象,然后对对象进行解构;都为 undefined
(4)参数的解构,如果给等号左边的变量赋默认值,如果右边对象没有值,就是用 默认值;如果默认值以对象的方式赋予,那么参数只有为空时才使用默认值
(5) null 和 undefined 解构为对象时,都报错