赋值解构
- 赋值解构使得声明变量更简洁。特点是左边多个变量,右边是一个对象或数组。
1 | // 解构出对象的属性 |
1 | // 解构出对象的属性并重新取名 |
1 | // 解构数组 |
1 | // 解构时给变量默认值 |
1 | // 解构 rest的使用。...能解构剩余属性值 |
Generator生成器
- 可以理解为一个状态机,封装了多个内部状态,每次调用就遍历并执行一个状态。这样就可以使得多个函数共同配合完成某个任务。
1 | function* helloWorldGenerator() { |
- Generator可以作为一个暂缓执行函数
1 | function* f() { |
Generator有3个方法 next() throw() return()。它们将yield替换成值、throw语句、return语句。next里面传值时会被当做上一个yield的值
Generator轻松遍历所以数组成员
1 | function* iterTree(tree) { |
- Generator实现协程。A B两个方法交替执行完成同一个任务
1 | // A函数 |
- 生成器本身带有Symbol.iterator。Symbol:唯一标识id,iterator:生成器
监听对象属性变化
- Object.defineProperty通过监听对象属性的读取和修改触发函数执行业务代码
1 | let obj = { |
- 代理Proxy类似于defineProperty的加强版
1 | let obj = { |
async await的用法
async和await配合使用常用来解决回调地狱的问题,可以使代码更简洁
1 |
|
异步操作结束->通知到resolve()函数->通知到await可以执行下面代码了。用generate生成器也可以做到这一点。
call、apply、bind的区别
每个函数都包含这3个方法,它们能修改this的指向
1 | var a = { |
for…in和for…of
for循环相比于用api循环的优点在于可以主动用break结束循环,用return结束函数。
1 | // for in遍历对象 |
for…of其实隐式调用了Iterator方法(不断调用iterator.next())
执行效率:常规for循环 > forEach > for…of > map > for…in
面向对象Class
构造函数
构造函数其实就是一个普通的函数。
构造函数的写法:函数体内用this声明一些共有属性,用.prototype来申明共有方法,用new 构造函数()创建一个对象继承构造函数的属性和方法。通过原型的继承,它节约了内存。
js创建对象时都有一个_proto_的内置属性,它指向了构造函数的prototype。构造函数.prototype.constructor又指向构造函数本身
1
2
3
4
5
6
7
8
9
10
11
12var person = function(name){
this.name = name
};
person.prototype.getName = function(){
console.log('名字是:'+this.name);
}
var aa = new person('cat');
var bb = new person('dog')
aa.getName(); //名字是:cat
bb.getName(); //名字是:dog
console.log(aa.__proto__ === person.prototype); //true
console.log(person.prototype.constructor === person); //true
Class
- 用class改造上面的构造函数。实例化一个对象的时候constructor里面的内容会执行一遍。
1
2
3
4
5
6
7
8
9
10
11
12
13class person {
constructor(name) {
console.log('constructor执行了');
this.name = name;
}
getName() {
console.log('名字是:'+this.name);
}
}
var a = new person('cat');
var b = new person('dog');
a.getName(); //名字是:cat
b.getName(); //名字是:dogclass可以通过extends来继承,constructor内使用super()调用父类的构造方法
1
2
3
4
5
6
7
8
9
10
11
12class personA extends person {
constructor(name, food) {
super(name);
this.food = food;
}
myfood() {
console.log('吃东西:'+this.food)
}
}
var a = new personA('cat', 'apple');
a.myfood();
a.getName();