es6学习总结

ES6语法规范学习

let、const、var 三者比较

  • 不存在变量提升

    • let、const 声明变量之前无法使用

    • var 则会存在变量提升,没声明就可以使用

  • 暂时性死区

    • 在块级作用域内,使用let声明的变量不受块级外的全局变量等的影响。
  • 不允许重复声明

    • let在相同作用域内不允许重复声明
  • const声明常量,声明的常量不允许改变

    • 注意一点,const指向的是变量所在地址,对于变量中的数据结构则不能控制了

    例如,声明一个数组,可以向数组内增加数据,但是无法对数组内的值更改。

变量的赋值

  • 相比较以前而言可以进行匹配赋值。

let [a, b, c] = [1, 2, 3];

  • 只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。

赋值案例


function* fibs() {

  let a = 0;

  let b = 1;

  while (true) {

    yield a;

    [a, b] = [b, a + b];

  }

}

let [first, second, third, fourth, fifth, sixth] = fibs();

sixth // 5

  • 解构赋值允许指定默认值。

let [foo = true] = [];

* 默认值还可以变量,前提是这个变量已经声明
  • 对象赋值

let { foo: foo1, bar: bar1 } = { foo: 'aaa', bar: 'bbb' };

* 变量名的被赋值的是后者,例如foo:foo1,被赋值的是foo1,而不是foo。foo是匹配等号右边属性名为foo的,将其赋值给foo1
  • 对嵌套对象进行赋值

    const node = {

        loc: {

          start: {

            line: 1,

            column: 5

          }

        }

      };



      let { loc, loc: { start }, loc: { start: { line }} } = node;

      console.log(loc);

      console.log(start);

      console.log(line);


输出结果:

{ start: { line: 1, column: 5 } }

{ line: 1, column: 5 }

1

  • 解构赋值常用用途

    • 交换值

    • 函数可以有多个返回值

    • 设定函数参数默认值

    • 解析JSON对象中数据

    • …………

函数

  • 可以设定默认参数了。

  • 使用参数默认值时,函数不能有同名参数。

    • 函数同名时 后面的函数会覆盖前面的函数
  • 函数参数值可以设定为undefined 表示此参数可以省略

  • rest参数

    • 写法 (rest参数后不能再有其他参数)

    function 函数名(...变量名)

    实例funciton rest(...arr){}

    • 函数的length属性,不包含rest参数
  • name属性 调用name属性返回函数名

ES6中匿名函数会返回实际函数名,在ES5中是空串

  • 箭头函数

    • ES6中新的函数定义 可以使用 => 定义函数

    • 函数体内只有返回语句或单条语句,则可以省略{} ,注意单条语句若不想要返回值 在=>后加void

    例如,var canntReturn=cannt=>void 1

    • 函数只有单个参数可以省略 ()

    例如:var first=first=>1

    • 函数的只有一个返回语句,返回值是对象时,要注意加上()

    例如,var obj=()=>({name:"obj"});

    • 注意事项

      1. this指向的问题,this指向的是函数生效时所在的对象

      2. 不可使用new命令,不能当作构造函数

      3. 无法使用arguments对象,不过可用rest替代

      4. 不能用作Generator函数

      
      //第一点的案例
      
      function foo()
      
        setTimeout(() => {
      
          console.log('id:', this.id);
      
          }, 100);}
      
      var id = 21;
      
      foo.call({ id: 42 });
      
      //对于这里的call函数作用,原理等在下一个日报将进行分析。 
      
      
    • 不适用场景

      1. 对象内的方法定义

      2. 需要动态this的时候,像点击事件操作dom对象时,这里this指的就是这个dom

      3. 需要大量读写,函数体复杂时,使用普通函数

  • 尾调用优化

    • 尾调用优化指不需要保存外层函数调用帧,直接用内存调用帧取代外层调用帧

    • 尾调用优化是为了节省内存

    • 尾递归 就非常适合采用尾递归优化,这样 不会导致栈溢出

    • 尾调用优化,仅在严格模式下开启。

    • 在非严格模式下,我们可以将尾调用递归改写成循环,从而实现尾调用优化。

Set

  • Set本身是一个构造函数,用来生成 Set 数据结构。

  • 可利用Set去重复 利用rest和解构赋值


let arr=[1,1,2,2,3];

let arr1=[...new Set(arr)];

  • Set 插入和遍历顺序一致。

  • Set遍历方法

    • Set.prototype.keys():返回键名的遍历器

    • Set.prototype.values():返回键值的遍历器

    • Set.prototype.entries():返回键值对的遍历器

    • Set.prototype.forEach():使用回调函数遍历每个成员

    Set实现交并差的实例

    
    let a = new Set([1, 2, 3]);
    
    let b = new Set([4, 3, 2]);
    
    // 并集
    
    let union = new Set([...a, ...b]);
    
    // Set {1, 2, 3, 4}
    
    // 交集
    
    let intersect = new Set([...a].filter(x => b.has(x)));
    
    // set {2, 3}
    
    // 差集
    
    let difference = new Set([...a].filter(x => !b.has(x)));
    
    // Set {1}
    
    

pomise 对象

  • 用于异步操作

  • 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

  • Promise的两个特点

    1. 自身状态不受外界影响。只有异步操作结果能改变 这三种状态如下:

      • pending(进行中)

      • fulfilled(已成功)

      • rejected(已失败)

2. 状态改变后,不会变,任何时候都可以去获取结果。例如,事件不监听,但在结果产生后再设置监听,无法再获取结果,而对于Promise不影响。
  • 基本用法及实例解析

var promise = new Promise(function (resolve, reject) {

    if (/* 异步操作成功 */) {

        resolve(data);

    } else {

        /* 异步操作失败 */

        reject(error);

    }

});

上面参数作用

  1. resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

  2. reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

在Promise生成后,用 then 方法分别指定 resolved 状态和 reject 状态的回调函数


promise.then(function(data) {

  // do something when success

}, function(error) {

  // do something when failure

});

第二个 function(error) 不是必选项,可以省略

这是reject函数 回调的。

一个具体的实例


var promise = new Promise(function(resolve, reject) {

  console.log('before resolved');

  resolve();

  console.log('after resolved');

});

promise.then(function() {

  console.log('resolved');

});

console.log('outer');

输出结果为


before resolved

after resolved

outer

resolved

解释:resolve的回调只有在同步操作全部完成后才能执行

异步图片加载实例


//url  传入的相对地址  这个方法是返回一个Promise对象实例。

function loadImageAsync(url) {

  return new Promise(function(resolve, reject) {

      //html中的Image对象,在NODEJS环境下

      //Image未定义

    const image = new Image();

    //onload 当图像装载完毕时调用的事件句柄。

    image.onload = function() {

    //当图片加载成功后调用resolve

      resolve(image);

    };

    //onerror 在装载图像的过程中发生错误时调用的事件句柄。

    image.onerror = function() {

        //当图片加载错误后调用reject

      reject(new Error('Could not load image at ' + url));

    };

    //设置图像的 URL

    image.src = url;

  });

}

注意事项:

  1. then的使用.

    • then方法返回的是一个新的Promise实例,不再是原来的最初的Promise实例。因此可以采用链式写法,即then方法后面再调用另一个then方法。

    • 实例

    
    var p=new Promise(function(resolve,reject){
    
        console.log('创建一个Promise实例');
    
        resolve(1);
    
    });
    
    var p2=new Promise(function(resolve,reject){
    
        console.log('创建一个Promise实例');
    
        resolve(1);
    
    });
    
    //非链式then
    
    p.then(function(data){
    
        console.log("开始非链式结构的then:")
    
        return ++data;
    
    });
    
    p.then(function(data){
    
        return ++data;
    
    });
    
    p.then(function(data){
    
        console.log("data:"+data);
    
    
    
    });
    
    //链式then
    
    p2.then(function(data){
    
        console.log("开始链式结构的then:")
    
        return ++data;
    
    })
    
    .then(function(data){
    
        return ++data;
    
    })
    
    .then(function(data){
    
        console.log("data:"+data);
    
    });
    
    
    
    输出结果:
    
    创建一个Promise实例
    
    创建一个Promise实例
    
    开始非链式结构的then:
    
    data:1
    
    开始链式结构的then:
    
    data:3
    
    

模板字符串$ 可以在字符串中嵌入变量

  • 例如,

let obj='.js';

let str='index$('obj')';

Module 大致了解

  • import 输入其他模块提供的功能

  • export 规定模块的对外接口

装饰器

  • 相当于切面编程中的切点。

  • 不对函数使用

  • 在ES7中

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • 2017.11.12 数值的扩展 二进制和八进制表示法,分别使用0b和0o表示 Number.isFinite()...
    Gopal阅读 298评论 0 2
  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,710评论 1 56
  • 一、Promise的含义 Promise在JavaScript语言中早有实现,ES6将其写进了语言标准,统一了用法...
    Alex灌汤猫阅读 827评论 0 2
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,767评论 2 9
  • # Ajax标签(空格分隔): 笔记整理---[TOC]### 从输入网址开始:- 在学习ajax之前,你应该先了...
    V8阅读 263评论 1 0