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();
     
     
     
     
     
     
     



     


  • 相关阅读:
    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
    剑指OFFER----面试题04.二维数组中的查找
    剑指OFFER----面试题03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/chencuixin/p/6506188.html
Copyright © 2011-2022 走看看