zoukankan      html  css  js  c++  java
  • ES6整理

    1.let

    传统的变量声明都是用var        

    eg:

    (function(){
    var i = 1;
    var i = 10;
    console.log(i);
    })();

    ES6改用let变量
    声明
    eg:
    (function(){
      let i = 2;
      cosole.log(i);
    }
    与var的区别:
    1.let声明的变量只在当前代码块有效
    2.同一代码块里不允许出现重名let变量
    3.let特别适合用于循环(因为var声明的变量会有变量提升的情况)
    eg:
    var arr = [];
    for(var i = 0;i < 10;i++){
      arr[i] = function(){
      console.log(i);
    }
    }
    arr[3]();//此时i=10
    /****************************/
    var arr = [];
    for(let i = 0;i < 10;i++){
      arr[i] = function(){
      console.log(i);
    }
    }
    arr[3]();//此时i=3
    2.set
    (1)set是ES6新增的一种数据类型,语法特点与数组类似。
    (2)与数组不同的是set数据结构里的所有数据都是唯一的。

    eg:

    /******传统写法******/
    var arr = [1,2,3,4,6,6,7,7,8];
    /*传统遍历数组方法一*/
    for(var i = 0;i < arr.length;i++){
      console.log(arr[i]);//此时输出1,2,3,4,6,6,7,7,8
    }

    /*传统遍历数组方法二*/
    arr1.map(function(val){
      console.log(val);
    });

    /******set写法******/
    var set = new Set(arr);
    /*set遍历数组方法*/

    for(var element of set){//for in 循环不能遍历set集合,得用for of
      console.log(element );//此时输出1,2,3,4,6,7,8

    }
    /*set添加数据方法*/
    var set2 = new Set();
    for(var i = 0;i <10;i++){
      set2.add(i*2);
    }
    console.log(set2);

    /*set将集合转换为数组 扩展运算符*/
    var arr3 = [...set2];
    console.log(arr3);

    /*清空和删除set*/
    set2.delete(2);//没有索引,直接删除数据2
    console.log(set2);
    set2.clear();//清空set2数据
    console.log(set2);

    tip:为什么在删除的时候没有用索引?
    因为set数组的索引和数据是一样的。
    eg:
      
    let set3 = new Set([1,7,9,4,2,3,4]);

      set3.forEach(function(index,val){
        console.log(index+":"+val);//此时结果是1:1  7:7  9:9   4:4    2:2   3:3   4:4
      });
    /*判断set中是否有对应数据*/
    console.log(set3.has(9));//此时答案是true

    /*set数组长度*/
    console.log(set3.size);//此时是6,set没有length的属性
    3. weakSet
    与set使用方式类似。但与set的不同的地方在于WeakSet只能保存对象类型的数据,
    有add,clear,delete,has方法,但不能遍历,取值。

    eg:

    let ws1 = new WeakSet();
    let  num = new Number(5);
    ws1.add(5);//报错,因为5不是对象类型的数据
    ws1.add(num);//不报错,因为num是对象类型的数据

    4.const
    用来声明变量,语法规则和let一样,但是const声明的变量不可修改,且只在当前的代码块有效,

    同一代码块里不允许出现重名const常量。
    eg:
    (function () {
    {
    const PI = Math.PI;
    const n = 2;
    //n = 5; //同一代码块里不允许出现重名const常量
    alert(n);
    let m = 3;
    m = 5;
    alert(m);
    }
    //alert(n); //const声明的常量只在当前的代码块有效
    })();

    5.symbol
    ES6新增的一种数据类型,表示独一无二的值。
    eg:
    {
    var a = "ccy";
    var b = "ccy";
    alert(a == b);
    }
    {
    let a = Symbol("ccy");
    let b = Symbol("ccy");
    alert(a == b);
    }
    6.map
    map也是ES6新增的一种数据类型,它的本质和对象一样都是
    键值对的集合
    与对象不同的是,它的键值可以是各种数据类型。
    let map1 = new Map();
    var obj1 = new Object();
    var obj2 = new Object();
    /*set方法 添加值*/
    map1.set(obj1,"对象键值1");
    map1.set(obj2,"对象键值2");
    /*get方法获取值*/
    console.log(map1.get(obj1));
    console.log(map1.get(obj2));
    /*has方法判断是否存在*/
    console.log(map1.has(obj2));
    /*delete方法删除数据*/
    map1.delete(obj2);
    console.log(map1.size);
    /*clear清空数据*/
    map1.clear();
    console.log(map1.size);

    /*数组作为构造函数参数*/
    let arrMap = new Map([['name','ccy'],['age','18']]);
    console.log(arrMap);
    /*forEach遍历Map*/
    arrMap.forEach(function(val,key){
    console.log(key+":"+val);
    });

    /*转换成数组 扩展运算符*/
    let arr = [...arrMap];
    console.log(arr);

    /*for of循环*/
    for(let i of arrMap){
    console.log(i);
    }

    /*键迭代器*/
    let keys = arrMap.keys();
    console.log(keys);
    for(var i = 0 ; i < arrMap.size; i++){
    console.log(keys.next().value);
    }

    /*值迭代器*/
    let vals = arrMap.values();
    console.log(vals);

    /*获取map的大小*/
    let size = arrMap.size;
    console.log(size);

    /*数字类型的键名*/
    let ccy = new Map([[1,"zhangsan"],[2,"lisi"]]);
    ccy.forEach(function(val,key){
    console.log(key+":"+val);
    });

    7.weakMap
    weakMap和Map相似,但是区别是weakMap只能接收对象键值的数据
      eg:
      let wm = new WeakMap();
      let obj = new Object();
      obj.name = "name";
      wm.set(obj,"hello");
      console.log(wm.has(obj));
      console.log(wm.get(obj));
      wm.delete(obj);
      console.log(wm.get(obj));


    8.Arrow
    /*标准函数定义形式*/
    function show(){ //无参
    console.log("hello");
    }
    show();
    /*箭头函数写法*/
    let show2=()=>{ //无参
    console.log("hello");
    }
    show2();
    /*标准写法*/
    function showName(name){    //有参
        console.log(name);
    }
    showName("ccy");
    /*箭头函数写法*/
    let showName2=(name)=>{ //有参
    console.log(name);
    }
    showName2("ccy");

    /*标准写法*/
    function add(a,b){ //有参有返回值
    return a+b;
    }
    console.log(add(2,3));
    /*箭头函数写法*/
    let add2=(a,b)=>a+b; //有参有返回值
    console.log(add2(2,3));

    /*标准写法*/
    function add3(a,b){ //有参有返回值有输出操作
    console.log("我是加法运算");
    return a+b;
    }
    console.log(add3(2,3));
    /*箭头函数写法*/
    let add4=(a,b)=>{ //有参有返回值有输出操作
    console.log("我是加法运算");
    return a+b;
    }
    console.log(add4(2,3));


    看惯了标准函数,箭头函数看起来是不是很难看,那ECMA设计它来干什么??
    箭头函数可以优化对this的操作,它对this的处理与一般的普通函数不一样。
    箭头函数的this始终指向函数定义时的this,而不是执行时。

    var obj = {
    data:"我是测试数据",
    fun:function(){
    console.log(this.data);//this指向谁?
    },
    fun2:function(){
    setTimeout(function(){
    //console.log(this);
    this.fun();
    },1000);
    }
    }
    obj.fun();
    //obj.fun2() //报错! 因为定时器函数里的this的指向已经发生偏移,指向window对象

    /*用箭头函数解决这个问题*/
    var obj2 = {
    data:"我是测试数据",
    fun:function(){
    console.log(this.data);
    },
    fun2:function(){
    setTimeout(()=>{//匿名函数 没有参数
    this.fun();
    },1000);
    }
    }
    obj2.fun();
    obj2.fun2();

    9.promise
    function fun1(){
    return new Promise(function(resolve,reject){
    setTimeout(function(){
    console.log("我是函数1");
    resolve(111);
    //reject("函数1发生错误");
    param = "我是函数1的数据";//往后面的函数传递参数
    },4000);
    });
    }
    function fun2(){
    return new Promise(function(resolve,reject){
    setTimeout(function(){
    console.log("我是函数2");
    console.log(param);
    resolve(222);
    },3000);
    });
    }
    function fun3(){
    return new Promise(function(resolve,reject){
    setTimeout(function(){
    console.log("我是函数3");
    console.log(param);
    resolve(333);
    },2000);
    });
    }
    function fun4(){
    return new Promise(function(resolve,reject){
    setTimeout(function(){
    console.log("我是函数4");
    console.log(param);
    },1000);
    });
    }

    fun1().then(function(data){
    console.log(data);//fun1的resolve传递的数据
    }).then(fun2).then(function(data){
    console.log(data)
    }).then(fun3).then(function(data){
    console.log(data)
    }).then(fun4).then(function(data){
    console.log(data);
    }).catch(function(err){
    console.log(err);
    if(err == "函数1发生错误"){
    //fun2().then(fun3).then(fun4);//哪怕函数1发生错误,我也也可安排函数继续往下进行。
    }
    });

    10.Iterator
    /*声明一个数组*/
    let arr = [1,2,3,4,5];
    /*声明一个遍历器*/
    let it = arr[Symbol.iterator]();
    for(;;){
    let ele = it.next();
    if(ele.done == true){
    break;
    }
    console.log(ele.value);
    }
    /*能使用遍历器的有数组、对象、set和map,能使用遍历器的,就可以使用for of*/
    for(var i of arr){
    console.log(i);
    }

    /*展开运算符*/
    var newArr = [...arr];
    console.log(newArr);

    11.generator
    /*每一个yeild语句定义不同的状态,它是一个代码执行暂停标识。
    return也是定义了一个状态。*/
    function* show(){
    yield "第一个阶段";
    yield "第二个阶段";
    yield "第三个阶段";
    yield "第四个阶段";
    return "end";
    }

    /*调用show函数,函数不会立即执行,而是返回一个遍历器对象*/
    var itFunction = show();
    /*对遍历器对象依次调用next()去执行*/
    console.log(itFunction.next());
    console.log(itFunction.next());
    console.log(itFunction.next());
    console.log(itFunction.next());
    console.log(itFunction.next());


    function* show2(){
    yield function fun1(){
    setTimeout(function(){
    console.log('chenchuanyin');
    },1000);
    };
    yield function fun2(){
    console.log("ccy");
    }
    }
    var itFun = show2();
    var fun1 = itFun.next().value;
    var fun2 = itFun.next().value;
    fun1();
    fun2();

    13.destructuring
    /*数组解构赋值*/
    function arr(){
    {
    /*完全解析*/
    let [a,b,c] = [1,2,3];//普通
    console.log(a+":"+b+":"+c);

    let [a1, [[b1], c1]] = [1, [[2], 3]];//嵌套
    console.log(a1+":"+b1+":"+c1);

    let [ , , third] = ["foo", "bar", "baz"];
    console.log(third);

    let [x, , y] = [1, 2, 3];
    console.log(x+":"+y);


    /*不完全解析*/
    let [x1, y1] = [1, 2, 3];
    console.log(x1+":"+y1);

    let [x3,, y3 = "cc", z3 = "ccy"] = [1, 2, 3];
    console.log(x3+":"+y3+":"+z3);

    let [a2, [b2], d2] = [1, [2, 3], 4];
    console.log(a2+":"+b2+":"+d2);
    }
    };
    arr();

    /*对象解构赋值*/
    function obj(){
    /*对象的属性没有次序,变量必须与属性同名,才能取到正确的值*/
    let {foo, bar ,arr:[name,age,id="001"]} = {foo: "aaa", bar: "bbb" ,arr:["zhangsan","18"]};
    console.log(foo+":"+bar+":"+name+":"+age+":"+id);
    }
    obj();

    /*字符串解构*/
    let [q,w,e] = "ccy";
    console.log(e);

    /*函数参数解构*/
    let funObj = {
    name:"ccy",
    age:"18"
    };
    function show({name,age,id="002"}){
    console.log(name+":"+age+":"+id);
    }
    show(funObj);

    14.class
    /*之前语法定义类*/
    /*定义一个类*/
    function Person(name,age,add){
    this.name = name;
    this.age = age;
    this.add = add;
    this.say = function(){
    console.log(this.name+":"+this.age+":"+this.add);
    }
    }
    /*定义鼎泰属性和静态方法*/
    Person.node = "ccy";
    Person.run = function () {

    };
    /*实例化出来一个对象*/
    var student1 = new Person("王**",28,"福山区");
    student1.say();

    /*ES6定义类的语法*/
    class Human{//定义类名
    constructor(name,age,add){//构造函数
    this.name = name; //成员属性
    this.age = age;
    this.add = add;
    this.say = function(){ //成员方法
    console.log(this.name+":"+this.age+":"+this.add+":1");
    };
    /*方法重载:在同一个类里面,方法名相同,参数列表不一样。
    但是这里没有重载!!!只是覆盖!*/
    /*this.say = function (id,no) {
    console.log(this.name+":"+this.age+":"+this.add+":"+":2");
    }*/
    }
    /*静态属性和方法*/
    //static 'n' = "jereh";
    static sayName(){
    console.log("我是类方法!");
    }
    }
    let student2 = new Human("龚*",27.5,"莱山区");
    //Human.sayName();
    student2.say();
    student2.say("10001","1608");
    //console.log(Human.n);
    Human.sayName();

    /*继承*/
    class Animal{
    constructor(kind){
    this.kind = kind;
    }
    say(){
    console.log(this.kind+"也会说话");
    }
    }
    let dog = new Animal("狗");
    dog.say();

    class Dog extends Animal{
    /*如果又自定义构造函数,一定注意调用super()*/
    constructor(kind,CatchR){
    super();
    this.kind = kind;
    this.CatchR = CatchR;
    }
    /*之前的方法不能满足需要,这里进行 重写 !!*/
    say(){ //方法的重写
    console.log(this.kind+"汪汪!"+this.kind+"追"+this.CatchR);
    }
    }
    let dog2 = new Dog("狗","兔子");
    dog2.say();

    class Cat extends Animal{
    constructor(kind,EatFish){
    super();
    this.kind = kind;
    this.EatFish = EatFish;
    }
    say(){
    console.log(this.kind +"喵喵!"+this.kind+"吃"+this.EatFish)
    }
    }
    var cat = new Cat("猫","鱼");
    cat.say();
     
     
     
     
     
     
     



     


  • 相关阅读:
    事务的基本特性和隔离级别
    mysql锁的类型
    索引设计的原则
    mysql聚簇索引和非聚簇索引的区别
    spring事务什么时候会失效?
    spring事务传播机制
    GAN的Pytorch实现
    DCGAN的Pytorch实现
    PyTorch学习教程、手册
    去噪论文合集Paper
  • 原文地址:https://www.cnblogs.com/chencuixin/p/6506188.html
Copyright © 2011-2022 走看看