ECMAScript6学习

149 阅读4分钟

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

生成器 能暂停

  1. 参数
  2. 返回

3.yield

  1. 参数 function(a,b,c)
  2. 返回 return

4.generator+promise配合

  1. 外来的runner辅助执行:不统一,不标准,性能低
  2. generator函数不能写成箭头型

5.async/await

async function(){
...
let 结果 = await 异步操作
...
{

异步操作:promise/generator/另一个async函数 async:能暂停