• es6语法


    /*---------------------Es6编码规范---------------------*/
    //1、块级作用域
    //let 取代 var
    //在全局环境,不应该设置变量,只应设置常量 const优于let。
    const a='1';
    const b='1';
        {
            let a='2';
            let b='3';
        }
     
    //2、静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号
    const c='world';
    console.info(`hello ${c}`); //hello world
     
    //3、解构赋值
    // 使用数组成员对变量赋值时,优先使用解构赋值。
    const d=[1,2,3,4];
    const [d1,d2,d3,d4]=d;
    console.info(d1,d2,d3,d4); //1 2 3 4
    //函数的参数如果是对象的成员,优先使用解构赋值
    function e({e1,e2}){
     console.info(e1,e2);
    }
    e({e1:'hello',e2:'world'}); //hello world
    //对象解构 注: 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者
    //const {name,petName}={"name":"leyi","petName":"jiucaiqiezi"};
    //相当于
    const {name:name,petName:petName}={"name":"leyi","petName":"jiucaiqiezi"};
    console.info(name,petName);
     
    //如果函数返回多个值,优先使用对象的解构赋值
    function g(){
        return {g1:"1",g2:"2",g3:"3"};
    }
     const {g1,g2,g3}=g();
     console.info(g1,g2,g3); //1 2 3
     
    //4、定义对象 单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象,最后一个成员以逗号结尾。
    const h={h1:1,h2:2,h3:3};
    const i={
        i1:1,
        i2:2,
    };
     
    //对象尽量静态化,一旦定义,就不得随意添加新的属性。。
    const j={"name":"leyi",petName:null}; //petName预先定义好
    j.petName='jiucaiqiezi';
    //如果添加属性不可避免,要使用Object.assign方法
    Object.assign(j,{'att3':"att3"});
    console.info(j);// {name: "leyi", petName: jiucaiqiezi, att3: "att3"}
     
    //如果对象的属性名是动态的,可以在创造对象的时候,使用属性表达式定义
    function getKey(ag=true){
        return ag?'petName':'xxName';
    }
    const k={
        name:"leyi",
        [getKey(false)]:'jiucaiqiezi',
    };
    console.info(k);
     
    //对象的属性和方法,尽量采用简洁表达法
    const l={
        name:"leyi",
        getPetName(val){ //省略function
            return l.name+`-----${val}`;
        },
    };
    console.info(l.getPetName('qiezijiucai'));
     
    //5、使用扩展运算符(...)拷贝数组
    const m=[1,2,3,4,5];
    const n= [...m];
    console.info(n);
     
    //6、立即执行函数可以写成箭头函数的形式
    (() => {
        console.log('hello world');
    })();
     
    //简单的、单行的、不会复用的函数,采用箭头函数。如果函数体较为复杂,行数较多,还是应该采用传统的函数写法。
    const o=[1, 2, 3].map(x => x * x);
    console.info("o--------",o);
     
    function qq(params){
        for(let item of params){
            console.info(item);
        }
    }
    const q = (...params) => qq.apply(this,params);
    q([7,8,9]); //7 8 9
     
    /*---------------------let和const---------------------*/
    //let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
     
    //const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
    const obj1={"name":"leyi"};
    //obj1={} 指向新的内存地址就会报错
    obj1.petname="qiezijiucai"; //常量本身是可变的
    console.info(obj1);
     
    /*---------------------数组的扩展---------------------*/
    //Array.from()用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象
    const p = document.querySelectorAll('p');
    Array.from(p).forEach(function (item,index) {
        console.info(item,index);
    });
    //任何有length属性的对象,都可以通过Array.from方法转为数组。
    console.info(Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }));//["a", "b", "c"]
     
    //转换字符串为数组
    console.info(Array.from('jiucaiqiezi'));//["j", "i", "u", "c", "a", "i", "q", "i", "e", "z", "i"]
     
    //Array.of()方法用于将一组值,转换为数组。弥补原来数组构造函数Array()的不足
    console.info(Array(1));//原先只传递给它一个数字参数,该构造函数将返回具有指定个数、元素为 undefined 的数组
    console.info(Array(),Array.of(1),Array.of(1,4,7));
     
    //Array.prototype.copyWithin(target, start = 0, end = this.length)
    //数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员)
    console.info([1,2,3,4,5,6,7].copyWithin(0,2));//[3, 4, 5, 6, 7, 6, 7]
     
    //find方法,用于找出第一个符合条件的数组成员,它的参数是一个回调函数,所有数组成员依次执行该回调函数
    console.info([7,8,9,8].find(item=>item==8)); //8
     
    //findIndex 返回第一个符合条件的数组成员的位置
    console.info([7,8,9,8].findIndex(item=>item==8)); //1
     
    //fill方法使用给定值,填充一个数组,fill方法一般用于空数组的初始化。数组中已有的元素,会被全部抹去。第二个和第三个参数,用于指定填充的起始位置和结束位置
    console.info([1,2,3].fill('a',2)); //[1, 2, "a"]
    console.info(Array.of(1).fill('a'));//["a"]
     
    //ES6提供三个新的方法——entries(),keys()和values()——用于遍历数组
    for(let [index,value] of [3,4,5].entries()){ //entries()是对键值对的遍历
      console.info(index+'------'+value); //0------3  1------4 test.js:208 2------5
    }
    for(let item of [3,4,5].entries()){
        console.info(item); //[0, 3] [1, 4] [2, 5]
    }
    for(let item of [3,4,5].keys()){
        console.info(item); //0 1 2
    }
    //测试有问题 暂不知道什么原因 报错values is not a function
    /*for(let item of [33,44,55].values()){
        console.info(item);
    }*/
     
    //includes 方法返回一个布尔值,表示某个数组是否包含给定的值
    //对比map和set的has map的has 判断键名字 set判断值
    //代替 indexOf console.info([7,8,9].indexOf(8)!=-1); //true
    console.info([7,8,9].includes(8)); //true
     
    //由于空位的处理规则非常不统一,数组避免出现空位,ES6明确将空位转为undefined
     
    /*---------------------函数的扩展---------------------*/
    //ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
    //定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数
    function fn(x,y=2){
       console.info(x,y)
    }
    fn(1,undefined);//如果传入undefined,将触发该参数等于默认值,null则没有这个效果
     
    //默认值所处的作用域,不是全局作用域,而是函数作用域。
    const x=1;
    function fn1(x,y=x){
       console.info(x); //10
    }
    fn1(10);
     
    const xx=1;
    function fn01(y=xx){ //let y=xx xx 参数y = xx形成一个单独的作用域。这个作用域里面,变量xx本身没有定义,所以指向外层的全局变量x。
        console.info(xx); //1
    }
    fn01();
     
    //参数默认值可以与解构赋值,联合起来使用。
    function fn2({x,y = 20}){
        console.log(x, y);
    }
    fn2({}); // undefined 20
    fn2({x: 1}); // 1, 20
     
    //rest参数是一个数组(...变量名),用于获取函数的多余参数,该变量将多余的参数放入数组中
    function fn3(array,...list){ //rest参数之后不能再有其他参数
        console.info(list); //[4, 5, 6]
        list.forEach(function(item){
            array.push(item);
        });
        console.info(array);
    }
    fn3([1,2,3],4,5,6);//[1, 2, 3, 4, 5, 6]
     
    //扩展运算符
    //扩展运算符是三个点(...)。它好比rest参数的逆运算,将一个(数组)转为用逗号分隔的参数序列
     
    function fn4(x,y,z){
        return x+y+z
    }
    const list=[1,2,3];
    console.info(...list); //1 2 3
    console.info([...list]); //[1, 2, 3]
    console.info(fn4(...list)); //6
     
    //代替apply方法
    function fn04(x, y, z) {
       console.info(args); //[1, 2, 3]
       console.info(x,y,z); //1 2 3
    }
     
    var args = [1, 2, 3];
    fn04.apply(null, args);
     
    function fn040(x, y, z) {
        console.info(...args) //1 2 3
    }
    var args = [1, 2, 3];
    fn040(...args);
     
    //利用Math.max方法,求出一个数组最大元素的写法。
    console.info(Math.max.apply(null,[1,2,3])); //3
    console.info(Math.max(...args));//3
     
     
    //扩展运算符与正常的函数参数可以结合使用
    function fn5(a,b,c,d,e){
      console.info(a,b,c,d,e) //1 2 3 4 5
    }
    const fn5list=[3,4,5];
    fn5(1,2,...fn5list);
     
    //将一个数组添加到另一个数组的尾部
    const fn6Arr=[7,8,9];
    const fn6Arr2=[10,11,12];
    fn6Arr.push(...fn6Arr2);
    console.info(fn6Arr);
     
    //扩展运算符还可以将字符串转为真正的数组,任何类似数组的对象,都可以用扩展运算符转为真正的数组。
    console.log([..."hello"]); //["h", "e", "l", "l", "o"]
     
    //扩展运算符的运用
    //合并数组
    const arr2=[1,2,3,4],arr3=[5,6,7],arr4=[8,9,10];
    console.info([...arr2,...arr3,...arr4]); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     
    //与解构赋值结合
    const [aa,...bb]=[1,2,3,4,5,6];
    console.info(aa,bb); //1 [2, 3, 4, 5, 6]
    const [cc,...dd]=[];
    console.info(cc,dd); //undefined []
     
     
    /*箭头函数,ES6允许使用“箭头”(=>)定义函数。
     * 函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。
     不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
     不可以使用arguments对象,该对象在函数体内不存在
     * */
    const fn7=ag1=>ag1;
    //等同于
    /*var fn7 = function(ag1) {
        return ag1;
    };*/
    console.info(fn7(1));
     
    //箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
    const fn8=(ag1,ag2)=> ag1+ag2;
    console.info(fn8(1,2));
     
    //如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
    const fn9=(ag1,ag2)=>{
        return ag1+ag2
    }
    console.info(fn9(3,4)); //7
     
    //如果箭头函数直接返回一个对象,必须在对象外面加上括号。
    const fn10=(ag1,ag2)=>({ag1:ag1,ag2,ag2});
    console.info(fn10(9,10));//{ag1: 9, ag2: 10}
     
    //箭头函数的一个用处就是简化回调函数写法
    const fn11=[1,2,3,4,5].map(item=>item+1);
    console.info(fn11);//[2, 3, 4, 5, 6]
     
    /*---------------------Set和Map数据结构---------------------*/
    //ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
    const s = new Set();
    [1,2,3,4,5,5,5,6].forEach(item => s.add(item));
    for (let i of s) {
        console.log(i);
    }
    console.info(...s); //1 2 3 4 5 6
     
    const set = new Set([1, 2, 3, 4, 4]);
    console.info(...set,set.size); //1 2 3 4 4
     
    console.info(...document.getElementsByTagName('p')); //把类数组转成数组
     
    console.info(...new Set([1,2,3,4,4,4,4])); //可以用于数组去重
     
    console.info(set.add(7)); //添加某个值,返回Set结构本身
    console.info(set.has(7)); //返回一个布尔值,表示该值是否为Set的成员。
    console.info(set.delete(7));//删除某个值,返回一个布尔值,表示删除是否成功。
    set.clear(); //清除所有成员,没有返回值。
    console.info(set);
     
    //Array.from方法可以将 Set 结构转为数组。
    const items = new Set([1, 2, 3, 4, 5,5,5]);
    const array = Array.from(items);
    console.info(array);
     
    //Set结构的实例有四个遍历方法
    const set2 = new Set(['red', 'green', 'blue']);
    for(let item of set2.values()){
        console.info(item); //由于 Set 结构没有键名,只有键值,所以keys方法和values方法的行为完全一致。
    }
    //返回键值对的遍历器
    for(let item of set2.entries()){
        console.info(item);
        /*
        * ["red", "red"]
         test.js:228 ["green", "green"]
         test.js:228 ["blue", "blue"]
        * */
    }
     
    //使用Set实现并集(Union)、交集(Intersect)和差集
    const set3=new Set([1,2,3,4,5]);
    const set4=new Set([1,3,4,6,7]);
    //并级
    console.info(new Set([...set3,...set4]));
     
    //交集
    var intersect=[...set3].filter((item)=>set4.has(item))
    console.info(intersect);
     
    //差集
    const difference= [...set3].filter((item)=>!set4.has(item));
    console.info(difference);
     
    //ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
    const map=new Map([['name','leyi'],["petName",'qiezi']]);
    console.info(map.size);//2
    console.info(map.has('name'));//true
    console.info(map.get('name'));//leyi
    console.info(map.get('name'));//leyi
    map.set({"obj":"halo"},'hallo');
    console.info(map);//{"name" => "leyi", "petName" => "qiezi", Object {obj: "halo"} => "hallo"}
     
    //Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
    const map2 = new Map();
    const k1 = {'a':"a"};
    const k2 = {'a':"a"};
    map2.set(k1, 111).set(k2, 222);
    console.info(map2.get(k1)); // 111
    console.info(map2.get(k2));// 222
     
    //Map构造函数接受数组作为参数,执行的过程是
    const mapItems3 = [
        ['name', 'leyi'],
        ['color', 'red']
    ];
    const map3 = new Map();
    mapItems3.forEach(
        ([key, value]) => map3.set(key, value)
    );
    console.info(map3); //{"name" => "leyi", "color" => "red"}
     
    //数组转为map
    const map4 =new Map( [
        ['name', 'leyi'],
        ['color', 'red']
    ]);
    console.info([...map4]);//Map 转为数组
     
    //Map 转为对象,如果所有 Map 的键都是字符串,它可以转为对象。
    function strMapToObj(map){
       let obj={};
       for(let [key,value] of map){
           obj[key]=value
       }
        return obj;
    }
    const map5=new Map().set('name',"leyi").set('color','red');
    console.info(strMapToObj(map5)); // {name: "leyi", color: "red"}
     
    //对象转为map
    function objToMap(obj){
        let map6=new Map();
        for(let item of Object.keys(obj)){
            map6.set(item,obj[item]);
        }
        return map6;
    }
    console.info(objToMap({"name":"leyi",'color':"red"}));//{"name" => "leyi", "color" => "red"}
     
    //Map 转为 JSON  Map 的键名都是字符串,这时可以选择转为对象JSON,Map 的键名有非字符串时,先通过扩展运算符转成数组
    const map7=new Map().set('name','leyi');
    function mapToJson(map){
        let obj={};
        for(let [key,value] of map){
            obj[key]=value
        }
        return JSON.stringify(obj);
    }
    console.info(mapToJson(map7));//{"name":"leyi"}
    

      转自:http://www.cnblogs.com/leyi/p/6706062.html

  • 相关阅读:
    检查两个单链表是否有交点
    检查链表中是否有环
    [转]根据二叉树的先序、中序遍历结果重建二叉树
    背包问题
    硬币问题
    部分和问题
    斐波那契计算
    最大公因数和最小共倍数
    计算一年中的第几天
    利用递归反向输出字符串
  • 原文地址:https://www.cnblogs.com/fengnovo/p/7920690.html
Copyright © 2020-2023  润新知