zoukankan      html  css  js  c++  java
  • es6复习笔记

    以前看过一遍,再次温习。
    这里主要记录一些容易错误的点,具体的请参考菜鸟教程

    const与let

    1.暂时性死区:

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

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

    2.不存在变量提升

    console.log(a);  //ReferenceError: a is not defined
    let a = "apple";
     
    console.log(b);  //undefined
    var b = "banana";
    

    3. let与var的全局变量

    使用 var 关键字声明的全局作用域变量属于 window 对象:

    var carName = "Volvo";
    // 可以使用 window.carName 访问变量
    

    使用 let 关键字声明的全局作用域变量不属于 window 对象:

    let carName = "Volvo";
    // 不能使用 window.carName 访问变量
    

    综上,let、const 在代码块里面会封闭起来;

    解构

    1.对象解构

    基本

    let { baz : foo } = { baz : 'ddd' };
    // foo = 'ddd'
    

    剩余运算符解构

    let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
    // a = 10
    // b = 20
    // rest = {c: 30, d: 40}
    

    Symbol

    1.作为唯一属性

    Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。

    2.作为常量

    比如枚举

    3.单例方式

    Symbol.for()
    Symbol.keyFor()

    Map 与 Set

    1.map迭代

    var myMap = new Map();
    myMap.set(0, "zero");
    myMap.set(1, "one");
     
    // 将会显示两个 log。 一个是 "0 = zero" 另一个是 "1 = one"
    for (var [key, value] of myMap) {
      console.log(key + " = " + value);
    }
    for (var [key, value] of myMap.entries()) {
      console.log(key + " = " + value);
    }
    /* 这个 entries 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。 */
     
    // 将会显示两个log。 一个是 "0" 另一个是 "1"
    for (var key of myMap.keys()) {
      console.log(key);
    }
    /* 这个 keys 方法返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键。 */
     
    // 将会显示两个log。 一个是 "zero" 另一个是 "one"
    for (var value of myMap.values()) {
      console.log(value);
    }
    /* 这个 values 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的值。 */
    

    2.map操作

    数组转换、克隆、合并

    3.set

    数组去重、并集、交集、差集

    Reflect与Proxy

    Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。

    Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

    ES6 字符串

    1.插入函数

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

    2.标签模板

    标签模板,是一个函数的调用,其中调用的参数是模板字符串。

    alert`Hello world!`;
    // 等价于
    alert('Hello world!');
    

    数值

    二进制、八进制 0bo

    常量

    新方法:

    Math.trunc
    用于返回数字的整数部分。
    
    Math.trunc(12.3); // 12
    Math.trunc(12);   // 12
    

    指数运算符

    1 ** 2; // 1
    // 右结合,从右至左计算
    2 ** 2 ** 3; // 256
    // **=
    let exam = 2;
    exam ** = 2; // 4
    

    对象

    1.属性名表达式

    const hello = "Hello";
    const obj = {
     [hello]
    };
    obj  //SyntaxError: Unexpected token }
     
    const hello = "Hello";
    const obj = {
     [hello+"2"]:"world"
    };
    obj  //{Hello2: "world"}
    

    2.Object.is(value1, value2)

    用来比较两个值是否严格相等,与(=)基本类似。
    与(
    =)的区别

    //一是+0不等于-0
    Object.is(+0,-0);  //false
    +0 === -0  //true
    //二是NaN等于本身
    Object.is(NaN,NaN); //true
    NaN === NaN  //false
    

    数组

    Array.of()

    将参数中所有值作为元素形成数组。

    console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4]
    

    Array.from()

    将类数组对象或可迭代对象转化为数组。

    // 参数为数组,返回与原数组一样的数组
    console.log(Array.from([1, 2])); // [1, 2]
    

    转换可迭代对象

    转换 map

    let map = new Map();
    map.set('key0', 'value0');
    map.set('key1', 'value1');
    console.log(Array.from(map)); // [['key0', 'value0'],['key1',
    // 'value1']]
    

    视图

    视图是用来操作内存的接口。

    视图可以操作数组缓冲区或缓冲区字节的子集,并按照其中一种数值数据类型来读取和写入数据。

    DataView 类型是一种通用的数组缓冲区视图,其支持所有8种数值型数据类型。

    创建:

    // 默认 DataView 可操作数组缓冲区全部内容
    let buffer = new ArrayBuffer(10);
        dataView = new DataView(buffer); 
    dataView.setInt8(0,1);
    console.log(dataView.getInt8(0)); // 1
    

    数组操作一直都是重点

    函数

    箭头函数

    箭头函数体中的 this 对象,是定义函数时的对象,而不是使用函数时的对象。
    ES6 之前,JavaScript 的 this 对象一直很令人头大,回调函数,经常看到 var self = this 这样的代码,为了将外部 this 传递到回调函数中,那么有了箭头函数,就不需要这样做了,直接使用 this 就行。

    适合使用的场景

    // 回调函数
    var Person = {
        'age': 18,
        'sayHello': function () {
          setTimeout(function () {
            console.log(this.age);
          });
        }
    };
    var age = 20;
    Person.sayHello();  // 20
     
    var Person1 = {
        'age': 18,
        'sayHello': function () {
          setTimeout(()=>{
            console.log(this.age);
          });
        }
    };
    var age = 20;
    Person1.sayHello();  // 18
    

    所以,当我们需要维护一个 this 上下文的时候,就可以使用箭头函数。

    不适合使用的场景

    定义函数的方法,且该方法中包含 this

    var Person = {
        'age': 18,
        'sayHello': ()=>{
            console.log(this.age);
          }
    };
    var age = 20;
    Person.sayHello();  // 20
    // 此时 this 指向的是全局对象
     
    var Person1 = {
        'age': 18,
        'sayHello': function () {
            console.log(this.age);
        }
    };
    var age = 20;
    Person1.sayHello();   // 18
    // 此时的 this 指向 Person1 对象
    需要动态 this 的时候
    
    var button = document.getElementById('userClick');
    button.addEventListener('click', () => {
         this.classList.toggle('on');
    });
    

    button 的监听函数是箭头函数,所以监听函数里面的 this 指向的是定义的时候外层的 this 对象,即 Window,导致无法操作到被点击的按钮对象。

    迭代器

    const items = ["zero", "one", "two"];
    const it = items[Symbol.iterator]();
     
    it.next();
    >{value: "zero", done: false}
    it.next();
    >{value: "one", done: false}
    it.next();
    >{value: "two", done: false}
    it.next();
    >{value: undefined, done: true}
    

    let 、const 和 var 用于 for..of

    如果使用 let 和 const ,每次迭代将会创建一个新的存储空间,这可以保证作用域在迭代的内部。

    const nums = ["zero", "one", "two"];
     
    for (const num of nums) {
      console.log(num);
    }
    // 报 ReferenceError
    console.log(num);
    

    从上面的例子我们看到,最后一句会报异常,原因 num 的作用域只在循环体内部,外部无效,具体可查阅 let 与 const 章节。使用 var 则不会出现上述情况,因为 var 会作用于全局,迭代将不会每次都创建一个新的存储空间。

    Class

    class 的本质是 function。

    实例属性:定义在实例对象( this )上的属性。

    class Example {
        a = 2;
        constructor () {
            console.log(this.a);
        }
    }
    

    构造函数

    class Test {
        constructor(){
            // 默认返回实例对象 this
        }
    }
    console.log(new Test() instanceof Test); // true
     
    class Example {
        constructor(){
            // 指定返回对象
            return new Test();
        }
    }
    console.log(new Example() instanceof Example); // false
    

    装饰器

    略过

    getter 与 setter 必须同级出现

    继承

    class Child2 extends Father {
        constructor(){
            super();
            // 调用父类普通方法
            console.log(super.test()); // 0
        }
        static test3(){
            // 调用父类静态方法
            return super.test1+2;
        }
    }
    Child2.test3(); // 3
    

    ES6 模块

    模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。

    每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。

    每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取。

    注意,模块是单例的

    ES6 Generator 函数

    略过

    async/await

    略过

  • 相关阅读:
    Solaris下批量kill掉oracle的session
    我写blog的方式变迁
    filezilla ftp client在win7 下获取ftp目录信息出错解决方法
    GNU System Monitor编译问题
    在vmware的Solaris虚拟机中安装vmtool
    关于golden gate director client的一点点使用总结
    测试 乱弹
    ORM的世界 (再补充)
    Yahoo Konfabulator
    轻量容器和注射依赖 的自实现
  • 原文地址:https://www.cnblogs.com/wyy5552/p/13289978.html
Copyright © 2011-2022 走看看