• ES6


    ES6官网

     ES6超全教程

    以下是我整理的一些,方便自己查看学习,未完持续

    ES6是什么?

    ECMAScript6(以下简称ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。

    ES6的目标,是使得JavaScript语言可以用来编写大型的复杂的应用程序,成为企业级开发语言。

    ES6和JavaScript的关系:

    前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 JScript 和 ActionScript)。日常场合,这两个词是可以互换的。

    ES6怎么用?

    1.变量

    var:一般函数中都是用var去定义变量,因为它是关键字可以预解析。

    let:ES6中推荐使用let去定义变量,let定义的是一般变量。

    const:const声明一个只读变量,声明之后不允许改变。

    示例:

    1.1 let 是在代码块内有效,var 是在全局范围内有效:

    1 {
    2   let a = 0;
    3   var b = 1;
    4 }
    5 a  // ReferenceError: a is not defined
    6 b  // 1

    1.2不能重复声明,let 只能声明一次 var 可以声明多次:

    1 let a = 1;
    2 let a = 2;
    3 var b = 3;
    4 var b = 4;
    5 a  // Identifier 'a' has already been declared
    6 b  // 4

    1.3 for 循环计数器很适合用 let:

     1 for (var i = 0; i < 10; i++) {
     2   setTimeout(function(){
     3     console.log(i);
     4   })
     5 }
     6 // 输出十个 10
     7 for (let j = 0; j < 10; j++) {
     8   setTimeout(function(){
     9     console.log(j);
    10   })
    11 }
    12 // 输出 0123456789

    变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。

    变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。

    1.4暂时性死区

    1 var PI = "a";
    2 if(true){
    3   console.log(PI);  // ReferenceError: PI is not defined
    4   const PI = "3.1415926";
    5 }

    ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。

    2.箭头函数

    ES6允许使用“箭头”(=>)定义函数

    示例:

    2.1 替换匿名函数

    1 基本用法//匿名函数
    2     div.onclick=function(){
    3         console.log("你好")
    4     }
    5     //箭头函数
    6     div.onclick=()=>{
    7         console.log("你好")
    8     }

    2.2 有一个参数的箭头函数

    1 var fn=(a)=>{
    2         console.log("abc");
    3     }
    4     //一个参数可以省略小括号,等价于:
    5     var fn=a=>{
    6         console.log("abc");
    7     }

    2.3 有2个及更多参数的箭头函数

    1  var f=(a,b,c)=>{
    2         console.log("abc")
    3     }
     1 var p={
     2         age:18,
     3         //es6中对象方法的箭头函数表示形式
     4         run:()=>{
     5             setTimeout(()=>{
     6                 //this:window
     7                 console.log(this);//this是window
     8             },100)
     9         },
    10         travel:function(){
    11             //this:p
    12             setTimeout(()=>{
    13                 console.log(this);//this是p
    14             },100)
    15         },
    16         //推荐使用的方式☆☆☆:es6中对象方法的简写形式
    17         say(){
    18             console.log("say方法中的this:",this);
    19             setTimeout(()=>{
    20                 console.log("say内部的延迟函数:",this);//this是p
    21             },100)
    22         },
    23     }
    24 
    25     p.run();
    26 
    27     p.travel();
    28 
    29     p.say();

    2.4 箭头函数和普通匿名函数有哪些不同?

    • 函数体内的this对象,就说定义所在的对象,而不是使用所在的对象
    • 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误
    • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
    • 不可以使用yield命令,因此箭头函数不能用作Generator函数
    • generator函数现在经常用async替代

    3.class类

    在ES6中,class作为对象的模板被引入,可以通过class关键字定义类,本质是function。

    示例:

    3.1 类定义:

     1 // 匿名类
     2 let Example = class {
     3     constructor(a) {
     4         this.a = a;
     5     }
     6 }
     7 // 命名类
     8 let Example = class Example {
     9     constructor(a) {
    10         this.a = a;
    11     }
    12 }

    注意:不可以重复声明一个类

    class Example{}
    class Example{}
    // Uncaught SyntaxError: Identifier 'Example' has already been 
    // declared
     
    let Example1 = class{}
    class Example{}
    // Uncaught SyntaxError: Identifier 'Example' has already been 
    // declared

    3.2 继承 子类 constructor 方法中必须有 super ,且必须出现在 this 之前。

    class Poetry {
      constructor(){
        console.log('山有木兮木有之');
      }
    }
    class Person extends Poetry{
      constructor(){
        super();
        console.log('本是青灯不归客');
      }
    }
    let ht = new Person();

    4.解构赋值

    解构赋值是对赋值运算的扩展。它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

    在解构中,有两部分:

    • 解构的源,解构赋值表达式的右边部分。
    • 解构的目标,解构赋值表达式的左边部分。

    4.1 数组模型的解构

    //1.基本
    let [a, b, c] = [1, 2, 3];
    // a = 1
    // b = 2
    // c = 3
    
    //2.可嵌套
    let [a, [[b], c]] = [1, [[2], 3]];
    // a = 1
    // b = 2
    // c = 3
    
    //3.可忽略
    let [a, , b] = [1, 2, 3];
    // a = 1
    // b = 3
    
    //4.不完全解构
    let [a = 1, b] = []; // a = 1, b = undefined
    
    //5.剩余运算符
    let [a, ...b] = [1, 2, 3];
    //a = 1
    //b = [2, 3]
    
    //6.字符串等
    //在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。可遍历对象即实现 //Iterator 接口的数据。
    let [a, b, c, d, e] = 'hello';
    // a = 'h'
    // b = 'e'
    // c = 'l'
    // d = 'l'
    // e = 'o'
    
    //7.解构默认值
    let [a = 2] = [undefined]; // a = 2
    //当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。
    let [a = 3, b = a] = [];     // a = 3, b = 3
    let [a = 3, b = a] = [1];    // a = 1, b = 1
    let [a = 3, b = a] = [1, 2]; // a = 1, b = 2

    4.2对象模型的解构

    //1.基本
    let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
    // foo = 'aaa'
    // bar = 'bbb'
     
    let { baz : foo } = { baz : 'ddd' };
    // foo = 'ddd'
    
    //2.可嵌套可忽略
    let obj = {p: ['hello', {y: 'world'}] };
    let {p: [x, { y }] } = obj;
    // x = 'hello'
    // y = 'world'
    let obj = {p: ['hello', {y: 'world'}] };
    let {p: [x, {  }] } = obj;
    // x = 'hello'
    
    //3.不完全解构
    let obj = {p: [{y: 'world'}] };
    let {p: [{ y }, x ] } = obj;
    // x = undefined
    // y = 'world'
    
    //4.剩余运算符
    let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
    // a = 10
    // b = 20
    // rest = {c: 30, d: 40}
    
    //5.解构默认值
    let {a = 10, b = 5} = {a: 3};
    // a = 3; b = 5;
    let {a: aa = 10, b: bb = 5} = {a: 3};
    // aa = 3; bb = 5;

    5.模板字符串

    模板字符串相当于加强版的字符串,用反引号`,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式

    5.1普通字符串

    1 let string = `Hello'
    'world`;
    2 console.log(string); 
    3 // "Hello'
    4 // 'world"

    5.2多行字符串

    1 let string1 =  `Hey,
    2 can you stop angry now?`;
    3 console.log(string1);
    4 // Hey,
    5 // can you stop angry now?

    5.3字符串插入变量和表达式

    变量名写在${}中,${}中可以放入JavaScript表达式。

    1 let name = "Mike";
    2 let age = 27;
    3 let info = `My Name is ${name},I am ${age+1} years old next year.`
    4 console.log(info);
    5 // My Name is Mike,I am 28 years old next year.

    5.4字符串中调用函数

    1 function f(){
    2   return "have fun!";
    3 }
    4 let string2= `Game start,${f()}`;
    5 console.log(string2);  // Game start,have fun!

    注意:模板字符串中的换行和空格都是会被保留的

  • 相关阅读:
    CF833 A The Meaningless Game
    [Noip2016]蚯蚓 (单调队列)
    [NOI2003]逃学的小孩 (贪心+树的直径+暴力枚举)
    [POI2014]FAR-FarmCraft (树规+贪心)
    洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
    [POJ1852] Ants(思维题)
    树的深度(我觉得没毛病)
    HDU
    剑指offer相关问题
    CC150相关问题
  • 原文地址:https://www.cnblogs.com/chensisi/p/13294640.html
Copyright © 2020-2023  润新知