ES6新语法
一.变量/赋值
var:可以重复定义,不能限制修改,没有块级作用域。let:不能重复定义,所声明的变量,只在let命令所在的代码块内有效。定义变量const:不能重复定义,定义常量(不能修改),一旦声明变量,就必须立即初始化,不能留到以后赋值。const的作用域与let命令相同:只在声明所在的块级作用域内有效。
暂时性死区:只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
解构赋值
- 等号左右两边结构必须一致
- 赋值和解构必须同步完成
arr=[1,2,3];
let [a,b,c]=arr;
$.ajax('xxx')=>{
code: xx;
data: xx;
}
let{code,data}=$.ajax('xxx');
块级作用域
let实际上为JavaScript新增了块级作用域。- ES6允许块级作用域的任意嵌套,外层代码块不受内层代码块的影响。
{{{{
{let insane = 'Hello World'}
console.log(insane); // 报错
}}}};
上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量。
块级作用域与函数声明
- ES6引入了块级作用域,明确允许在块级作用域之中声明函数。ES6规定,块级作用域之中,函数声明语句的行为类似于
let,在块级作用域之外不可引用。 - 对 ES6 的浏览器,浏览器的实现可以不遵守上面的规定,有自己的行为方式。
-允许在块级作用域内声明函数。 -函数声明类似于var,即会提升到全局作用域或函数作用域的头部。 -同时,函数声明还会提升到所在的块级作用域的头部。
上面三条规则只对ES6的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。
- 考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
顶层对象的属性
顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。ES5中,顶层对象的属性与全局变量是等价的。
ES6一方面为了保持兼容性,规定var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined
二.函数
默认参数
(a=xx,b=xx,c=xx)
参数展开(剩余参数,数组展开)
1. 用途一:接收剩余参数
function show(a,b,...名字)
剩余参数(形参的最后一个)必须在列表的最后。
2. 用途二:展开一个数组
let arr1 = [1, 1, 2, 2];
let arr2 = [1, 2, 2];
let json = { a: 1, b: 2 };
let json2 = { ...json, c: 3 };
function show(a, b, c, d) {
alert(a + b + c + d);
}
show(...arr1);//6
let result = [...arr1, ...arr2];
alert(result);//数组连接
alert(json2);//Json连接
三.数组/json
1.数组——5种
- map 映射:一个对一个
- reduce 缩减:n=>1
arr = [11, 22];
arr2 = arr.reduce(function (tmp, item, index) {
if (index == arr.length - 1) {
return (tmp + item) / arr.length;
} else {
return tmp + item;
}
});
- filter 过滤:根据某种条件进行筛选
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let arr2 = arr.filter(item => item % 2);
- forEach 遍历
Array.from([array-like])=>[x,x,x]:Array.from()可以把一个array-like转换为一个数组
2.JSON——5种
- ``:字符串模版,植入变量,任意折行。原样输出字符串内容。
startsWith
endsWith
5.面向对象
class:类声明 constructor:构造函数/构造器 extends:继承 super:父类/超类
- 普通函数:根据调用我的对象,this老变
- 箭头函数:根据所在的环境,this恒定
- bind:给函数定死一个this
四.异步操作
1.Promise
Promise:异步同步化
let p = new Promise((resolve, reject) => {
resolve();
reject();
});
p.then(
() => {},
() => {}
);
- Promise有用:解除异步操作
- Promise有局限:带逻辑的异步操作麻烦
Promise.all();与:所有的都成功Promise.race();或:只要有一个完成
2.generator
生成器 能暂停
- 参数
- 返回
3.yield
- 参数
function(a,b,c) - 返回
return
4.generator+promise配合
- 外来的runner辅助执行:不统一,不标准,性能低
- generator函数不能写成箭头型
5.async/await
async function(){
...
let 结果 = await 异步操作
...
{
异步操作:promise/generator/另一个async函数
async:能暂停