一、let关键字特点:
1.存在块级作用域,
2.不能重复声明,
3.不会预处理,不存在变量提升,
应用:循环遍历使用let代替var是趋势,建议大家使用let。
二、const关键字特点:
1.定义常量,不允许修改,
2.其他等同与let,
应用:习惯保存不用改变的数据。
三、解构赋值特点:
1.对象的解构赋值:let {a,b} = {a: xxx,b: xxx}(依据对象key,ab要对应),
2.数组的解构赋值:let [a,b,c] = [1,2,3,4](依据对应的下标),
应用:习惯传参数的时候比较好用,或读取JSON对象。
四、模版字符串:(简化字符串拼接)
1.let index = 456,
2.let str = `xxxxxxxx${index}xxxx`,
输出结果:xxxxxxxx456xxxx。
五、简化对象写法:
let name = "xx" , age = 10;
1.let obj = { //原始
name: name,
age: age,
setName: function(name){
this.name = name;
}
}
2.let obj = { //简化
name,
age,
setName(name){
this.name = name;
}
}
注意:省略同名属性,省略函数的function。
六、点点点运算符(…)
1.可取代arguments(伪数组不可使用数组的一般方法比如),比arguments更灵活,作为形参只能写在最后,
function xxx(...value){
cc.log(value);
}
xxx("kebi","nihao",42);//输出["kebi","nihao",42]真数组。
2.扩展运算符
let arr1 = [1,2,5];
cc.log(...arr1); //输出1 2 5相当于遍历了一下数组;但不允许在对象使用
七、形参数默认值
1.不多说,很多语言都有都一样。
八、箭头函数()=>{}:
1.形参数部分 - 不建议大家省略小括号,不直观。
2.函数体部分 - 也不建议省略(如果省略,将自动返回当前语句或表达式的结果,如果不省略且不指定返回值默认返回undefined)。
3.最重要的部分 没有自己的this,和常规函数相反this是定义时候决定的不是调用的时候决定的,外层函数的this就是箭头函数内部的this。
4.可以配合call apply bind 箭头函数去理解this的指向问题 不难。
九、Symbol(ES6新增类型)
1.回顾都有哪些类型typeof返回7种:string,number,boolean,undefined,object,function,symbol。
2.创建symbol类型数据时的参数只是作为标识使用,所以 Symbol()也是可以的。
3.除了定义自己使用的Symbol值以外,ES6还提供了大概11个内置的Symbol值指向语言内部使用的方法。
比如:Symbol.iterator;Symbol.for()等。
注意:Symbol属性是唯一的解决命名冲突,不能与其他数据进行计算包括字符串拼接;for in、for of不会遍历symbol属性
这里说一下iterator是一种接口机制(for...of的运行原理)为各种不同的数据解构提供统一的访问机制。
作用:1.为各种数据结构提供一个统一的、渐变的访问接口。
2.使数据结构的成员能够按照某种次序排列。
3.ES6创建了一种新的遍历命令for...of循环,iterator接口只要提供for...of消费。
原理:1.创建一个指针对象指向数据结构的起始位置。
2.第一次调用next方法,指针会指向数据结构第一个成员。
3.再次调用next方法,指针自动往后移动直到指向最后一位成员。
4.每次调用next方法会返回一个对象{value,done}对象
*value代表当前指针指向的数据结构成员值,遍历结束值为undefined
*done代表bool类型遍历结束后返回true,否则是false(引擎框架检测用)
原生具备iterator的数据结构类型:
Array/arguments/set(容器)/map(容器)/String
补充:三点运算...符也用的该接口,另外大家可以了解一下Object中的方法比如Object.keys(obj)//返回包含obj对象key值的数组
同样我们可以按照底层原理修改让自己的对象实现for...of遍历
十、Promisse对象
1.通常解决异步操作问题(异步操作以同步的流程表现出来,避免层层嵌套回调函数(俗称回调地狱)),
2.Promisse是一个构造函数,实例是promisse,
3.基本语法介绍promise对象的3种状态: pending:代表初始化状态 fullfilled:成功状态 rejected:失败状态
let promise = new Promise((resolve, reject)=>{
//1.自动初始化promise状态为pending
//2.执行异步任务(比如开启定时器和发送前后端请求)
setTimeout(()=>{
//3.根据异步任务结果修改promise状态
//成功(也可以传递参数let msg = "OK")
resolve(msg);//作用就是修改promise状态为成功-->fullfilled
//失败
reject();作用就是修改promise状态为成功-->rejected
},2000);
});
//4.修改成功和失败状态后会自动调用第一个和第二个回调(使用默认方法then)
promise
.then((msg)=>{
cc.log("成功了",msg)
},()=>{
cc.log("失败了")
})//可以多次调用
.then((msg)=>{
cc.log("成功了",msg)
},()=>{
cc.log("失败了")
});
十一、Generator(过度的一个概念慢慢淘汰了,不建议大家在花大时间去学习了解)
1.ES6提供解决异步变成的方案之一。
2.该函数内部封装不同状态的数据,用来生成遍历器对象。
3.可暂停函数yield用来暂停,next方法用来启动;每次返回的是yield后面表达式的结果。
尝试使用一下处理异步问题,和promise一样都比较啰嗦,回掉比较多的时候看代码也很麻烦。
function asyncUtil(){
setTimeout(()=>{
cc.log("执行异步任务");
let msg = "OK";
Gu.next(msg)
},2000);
}
function * generatorUtil(){
cc.log("函数开始执行1")
let xx = yield asyncUtil();//遇到yield暂停,并且具备返回值,进行传递参数 (OK)
cc.log(xx);
cc.log("函数开始执行2")
yield asyncUtil();
cc.log("函数开始执行3")
}
let Gu = generatorUtil();
Gu.next();//调用后才执行generatorUtil()
执行结果:
1.函数开始执行1
2.OK
3.执行异步任务
4.函数开始执行2
5.函数开始执行3
十二、async函数(ES7的内容因为用的比较多所以我们放到一起来学习,结合了Promisse和Generator)
概念:真正意义上解决异步回调问题,同步流程表达异步操作。
本质:Generator的语法糖。
语法:
async function foo(){
await 异步操作;
await 异步操作;
}
特点:
1.不需要像Generator去调用next方法,遇到await等待(暂停),当前异步执行完成就往下执行。
2.反回的总是Promis对象,可以用then方法进行下一步操作
3.语法更明确简单,使用过程中目前没有感觉有副作用。
尝试一下下经常结合Promisse使用:
function promiseUtil(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
cc.log("执行异步操作");
let msg = "数据"
resolve(msg);//可进行参数传递。
},2000);
})
}
async function asyncUtil(){
cc.log("函数开始执行1");
let data = await promiseUtil();//等待异步操作。
cc.log(data);
await promiseUtil();
}
asyncUtil();
//输出结果:
1.函数开始执行1
2.执行异步操作
3.数据
4.执行异步操作
十三、class
1.了解构造,一般方法,静态方法;继承。
这里不多说,了解这些前最好明白js的原型继承,因为这些底层都是依靠ji原型链实现的。
十三、模块