开端
上篇讲述如何调试ES6项目,本篇将介绍ES6的基本知识,涉及的主要是ES6特性,如果系统学习请找相关资料,强烈推荐《ES6 标准入门(第3版)》,在线版本http://es6.ruanyifeng.com/
ES6常用特性
定义变量和常量
ES6推荐使用let定义变量,使用const定义常量,而不是原来的var。为啥,主要有以下原因
1.var允许重复定,而let和const不能在同一作用域中重复定义。如下
//以下代码没毛病
function fun(){
var a =3;
console.log(a);
var a = 4;
console.log(a);
}
//语法错误
function fun(){
let a =3;
console.log(a);
let a = 4;
console.log(a);
}
2.let和var是块级作用域,var是顶级作用域。顶级作用域用起来一时爽,用多了就要呵呵了,不知道变量什么时候就被改了,因为在哪里都能定义,在哪里都能引用。
箭头符号
ES6中很多函数定义都会使用箭头符号"=>",比如:
fun=()=>{
const a =3;
console.log(a);
}
为什么放弃原来的定义方法,换成箭头符号,做过JavaScript中前端人员都有被this搞糊涂过经历,有了箭头符号就是指路明灯。再也不会把this是啥搞错啦,因为箭头符号定的函数体内,this肯定会是函数所在的对象。
面向对象开发
是的ES6支持面向对象开发,可以定义类,支持类的继承,静态成员,属性设置,一应俱全。
类的定义如下
//类定义
export default class Animal{
// 构造函数
constructor(nickName){
this._nickName = nickName;
Animal.count ++;
}
// 公有成员函数
speak(){return "hello";}
// 私有成员函数
_say(){return "zzz";}
// 获取属性
get NickName(){return this._nickName;}
// 设置属性
set NickName(value){this._nickName = value;}
// 静态方法
static showCount(){return Animal.count;};
}
// 静态变量
Animal.count = 0;
类的继承也不是问题
export default class Cat extends Animal{
constructor(nickName){
super(nickName);
}
playGame(){return "let's play";}
}
export default class Dog extends Animal{
constructor(nickName){
super(nickName);
}
doorGuard(){return "door guard";}
speak(){
return super.speak() + ', I\'m ' + this._nickName;
}
}
Promise和async
前端的IO或者服务访问都是异步的,比如http请求啥的。异步就得有个回调机制Promise就是为这个来做的,常用方法resolve,reject,这是自己定义Promise对象用的,但是对于伸手党,更熟悉的应该是then吧。这里不展开将如何定义Promise,使用是这样的。
fetch(`${url}`)
.then(resp => resp.json())
.then(json => json.result)
这么时候的时候还算方便,但是如果需要按顺序调用多个服务呢,那么就需要在then中嵌套fetch,这样就会嵌套好多层,代码那个酸爽。有什么办法呢,于是async出现了这货能让你不搞嵌套,写法
export async function getScenes(sceneName) {
const result = await fetch(`${url}`)
.then(resp => resp.json())
.then(json => json.result);
return result;
}
调用,要加上await。
async function call() {
const result = await getScenes('');
}
很多人以为fetch是ES6的方法,然鹅不是,fetch是DOM接口,所以在node.js中是无法使用的,特此说明。
其他
1.模板字符串,再也不用拼凑字符串啦,看上一节例子自己找亮点。
2.数组方法,我讲的是find,map,reduce这些,你确定不是讲hadoop?谁用谁知道,比你们写for不知道强了多少倍了
3.解构赋值,Object.assign,嗯,塞私货真方便
4.Reflect和Proxy,元编程了解一下,各种动态特性,让你眼花缭乱
5.Decorator,可以预见一波AOP的骚操作