欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

es6语法总结

程序员文章站 2023-01-29 14:36:42
es6语法总结 let和var的区别: (1)let申明的变量只在块级作用域中生效 (2)let变量不能重复定义 const 定义常量 常量的含义是就是不能修改的数 const使用的时候要注意两点...

es6语法总结

let和var的区别:

(1)let申明的变量只在块级作用域中生效

(2)let变量不能重复定义

const 定义常量 常量的含义是就是不能修改的数

const使用的时候要注意两点

(1)const也是有块级作用域的

(2)const申明的时候必须赋值

补充:什么是块级作用域? 用大括号{}包起来的

2、解构赋值

简而言之:就是赋值,是左边的结构和右边的结构要一一对应 数据的类型必须要一样

举例来说对象的解构赋值

{
   let a, b
   ({a,b}={a:1,b:2});   //左右两边的结构一一对应
}

使用结构赋值的好处

(1)变量的交换 [a,b]=[b,a]; 不需要使用中间变量

(2)函数数据的一一对应

{
   function f(){
      return [1,2]
   }
   let a, b
   [a,b]=f();
   cosole.log(a, b);
}

下面这个例子更好的说明了解构赋值的好处,有点绕 多看几遍 就领会了

{
   let metadata={
      title:’abc’,
      test:[{title:’test’,desc:’descrption’}]
      }
   let{title:estitle,test[{title:cntitle}]}=metadata;
   console.log(estitle,cntitle)
}

3、正则扩展

(说实话,我怕正则扩展怕的要死 没办法 硬着头皮学吧)

es6正则扩展主要是解决匹配字符大于两个字符的时候 一个非常好的解决方法 使用{}

注意:

    // #正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外
    // u+000a 换行符(\n)
    // u+000d 回车符(\r)
    // u+2028 行分隔符(line separator)
    // u+2029 段分隔符(paragraph separator)

4、字符串扩展

导入兼容库

npm install babel-polyfill --save-dev
(1)codepointat() includes() startswith() endwith() repeat()字符串方法 
codepointat() 对这种4个字节的字符,es5不能处理,正确处理4个字节存储的字符,返回字符的一个码点
includes()是否包含某一字符串
startswith() 以什么字符串开始
endwith() 以什么字符串结束 
repeat(n) 字符串重复几遍

(2) 处理日期很好用的padstart() padend() 方法

{
    console.log('1'.padstart(2,'0'));   //01
    console.log('1'.padend(2,'0'));   //10
}

(3)非常好用的标签模板(强烈推荐使用 在vue项目中也使用了这个)

使用标签模板的好处 处理xxx攻击 处理多语言转换的问题

看例子

{
    let user={
        name:'list',
        info:'hello world'
    }
   console.log( abc`i am ${user.name} ${user.info}`)
    function abc(s,v1,v2) {
        console.log(s,v1,v2)
        return s+v1+v2
    }
}

(4)raw对所有的\进行转义 使用的频率不高 了解即可

5、数值扩展

主要是一些方法的介绍

number.isfinite()    //判断是不是数 返回的是布尔值
number.isnan()      //判断是不是nan的值 返回的是布尔值
isinteger()         //判断是不是整数 返回的是布尔值
number.max_safe_integer   //这是一个常量 表示数的上线 返回的是2^53
number.min_safe_integer   //这是一个常量 表示数的下线 返回的是2^(-53)
number.issafeinteger()   //判断这个数是不是在上线和下线范围内 如果不在的话 数据存储就不准确了 
math.trunc()    //判断带小数的整数部分并返回 返回小数的整数部分
math.sign()    //判断一个数是正数、负数还是0 返回的是1、-1、0
math.cbrt()     //立方根的计算

6、数组的扩展

array.of() 就是把数组中的元素放置其中

array.from() 把一些枚数组或者集合转换成真正的数组,并且使用数组里面的方法去遍历

copewith()方法 console.log([1,2,3,4,5].copywithin(0,3,4)); [4,2,3,4,5] //不常用

find() 查找到符合的元素就返回,只返回一个元素

findindex() 与find类似,但是返回的是元素的下标

fill()将数组所有的元素都用 填充

keys() 返回下标值 索引

let index of values() 返回内容

let values of entries() 返回全部

let [index,values] of includes() 是否包含某一元素 返回true或false

7、函数的扩展

//参数默认值
function test(x,y='world'){
    console.log('默认值',x,y);
}
    test('hello')
谨记:如果你在y,后面在加一个参数 c,这个时候c必须也要赋初始值,不然就会报错

//作用域
{
    let a='test'
    function test2(a,y=a){
        console.log('作用域',a,y)
    },
    test2('hello')   //输出a和y的值都是hello
}

//rest参数
{
    function test3(...arg){
        for(let v of arg){
         console.log('rest',v)
        }
    }
    test3(1,2,3,4,'a')   rest 1
                         rest 2
                         ......
}
//扩展运算符
{
    console.log(...[1,2,3]);
    console.log(a,...[1,2,3]);
}
//箭头函数
{
    let arrow = v =>v*2;
    console.log('arrow',arrow(2));
    let arrow2 = () =>5;
    console.log('arrow2',arrow(2));
}
//尾调用
{
    function tail(x){
        console.log('tail',x);
    }
    function fx(x){
        return tail();
    }
    fx(123)  //tail 123
}

8、对象扩展

//属性表达式
{
    let a='b';
    let es6_obj={
        [a]:'c'
    }  
}
//object新增方法
object.is()  相当于===
object.assign() 拷贝
object.entries() 

9、symbol的用法

1、symbol 返回的是一个唯一值

2、symbol.for() //指向的是一个指针

下面这个例子很好的阐述了symbol的使用

{
    let a1=symbol.for('abc');
    let obj={
        [a1]:'123',
        'abc':345,
        'c':456
    };
    console.log('obj',obj)
    for(let [keys,values] of object.entries(obj)){
        console.log('let of',keys,values)
    }
    object.getownpropertysymbols(obj).foreach(function (item) {
        console.log(obj[item]);
    })
    reflect.ownkeys(obj).foreach(function (item) {
        console.log('ownkeys',item,obj[item])
    })
}

10、set—map数据结构

set
     new set() 定义方法 可以传参数也可以不传参数
     特性:数值的唯一性 去重
     set的四个方法 add delete clear has
     set的遍历keys() values() entries() foreach()
weakset
    weakset和set支持的数据类型不一样
    weakset的元素只能是对象 数值什么的都不行
    weakset是弱引用:不和垃圾回收机制拉钩 地址的引用 不检测地址是否被垃圾回收了
    没有clear方法 不能遍历
map
    set添加元素使用add方法
    map添加元素使用set()方法
    map得到数据时get()方法
//数据结构横向对比,增,查,改,删
{
    let map=new map();
    let array=[];
    //增
    map.set('t',1);
    array.push({t:1});
    console.info('map-array',map,array);
    //查
    let map_exist=map.has('t');
    let array_exist=array.find(item=>item.t);
    console.info('map-array-modify',map,array);
    //改
    map.set('t',2);
    array.foreach(item=>item.titem.t=2:'');
    console.info('map-array-modify',map,array);
    //删
    map.delete('t');
    let index=array.findindex(item=>item.t);
    array.splice(index,1);
    console.info('set-array-empty',set,array);
}
{
    //map,set,object对比
    let item={t:1};
    let map=new map();
    let set=new set();
    let obj={};

    //增
    map.set('t',1);
    set.add(item);
    obj['t']=1;

    console.info('map-set-obj',obj,map,set);

    //查
    console.info({
        map_exist:map.has('t'),
        set_exist:set.has(item),
        obj_exist:'t' in obj
    })

    //改
    map.set('t',2);
    item.t=2;
    obj['t']=2;
    console.info('map-set-obj-modify',obj,map,set);

    //删除
    map.delete('t');
    set.delete(item);
    delete obj['t'];
    console.info('map-set-obj-empty',obj,map,set)
}

11、proxy reflect

//直接上代码 就一清二楚了

{
    let obj={
        time:'2017-3-10',
        name:'net',
        _r:123
    }
    let monitor =new proxy(obj,{
        //拦截数据的读取
        get(target,key){
            return target[key].replace('2017','2018');
        },
        //拦截对象设置属性
        set(target,key,value){
           if(key==='name'){
               return target[key]=value
           }else {
               return target[key]
           }
        },
        //拦截key in object操作
        has(target,key){
            if(key==='name'){
                return true
            }else{
                return false
            }
        },
        //拦截删除操作
        deleteproperty(target,key){
            if(key.indexof('_')>-1){
                delete target[key]
                return true
            }else {
                return target[key]
            }
        },
        //拦截object.keys object.getownpropertysymbols object.getownpropertynames
        ownkeys(target){
            return object.keys(target).filter(item=>item!='time')
        }
    })
    monitor.time='2019'
    monitor.name='mukewang'
    console.log('get',monitor.time)
    console.log('set',monitor.time,monitor)
    // console.log('has','name' in monitor,'time' in monitor)
    // console.log('delete',monitor)
    // delete  monitor._r
    // console.log('delete',monitor)
    console.log(' ownkeys',object.keys(monitor))
}
{
    let obj={
        time:'2017-3-10',
        name:'net',
        _r:123
    }
    console.log('reflect.set',reflect.set(obj,'name','mukewang'));
    // console.log('reflect.get',reflect.get(obj,'name'))
    console.log('reflect.get', reflect.get(obj,'time'));
    console.log('reflect.has',reflect.has(obj,'_r'))
}

{
    function validator(target,validator){
        return new proxy(target,{
            _validator:validator,
            set(target,key,value,proxy){
                if(target.hasownproperty(key)){
                    let va=this._validator[key];
                    if(!!va(value)){
                        return reflect.set(target,key,value,proxy)
                    }else{
                        throw error(`不能设置${key}到${value}`)
                    }
                }else{
                    throw error(`${key} 不存在`)
                }
            }
        })
    }

    const personvalidators={
        name(val){
            return typeof val==='string'
        },
        age(val){
            return typeof val === 'number' && val>18
        },
        mobile(val){

        }
    }

    class person{
        constructor(name,age){
            this.name=name;
            this.age=age;
            this.mobile='1111';
            return validator(this,personvalidators)
        }
    }

    const person=new person('lilei',30);

    console.info(person);

    person.name='han mei mei';

    console.info(person);
}

12、类与对象

//基本定义和生成实例
{
    class parent{
        constructor(name='mukewang'){
            this.name=name;
        }
    }
    let v_parent=new parent('v');
}
//继承   class child extends parent{ }

//继承传递参数
{
    class parent{
        constructor(name='pengjing'){
            this.name=name;
        }
    }
    class child extends parent{
        constructor(name='child'){
            super(name);   //这个必须要被放在第一行 后面的属性this.  要跟在后面 不然会报错
            this.type='child'
        }
    }
    console.log('继承传递参数',new child())
}
静态方法依赖于类,通过类调用静态方法
实例方法依赖于类的对象,需要创建对象后
不管是静态方法还是静态属性都是直接通过类去调用
类的对象是new

//静态方法
{
    class parent {
        constructor(name = 'mukewang') {
            this.name = name;
        }
        static tell(){
            console.log('tell')
        }
    }
    parent.tell()  //静态方法的调用
}
//静态属性
{
    class parent {
        constructor(name = 'mukewang') {
            this.name = name;
        }
        static tell(){
            console.log('tell')
        }
    }
    parent.type='test';
    console.log('静态属性',parent.type)
}

13、promise 异步请求

以前执行异步请求一般都是通过callback() 但是如果有多个异步请求的话 使用call'back()回调函数是特别复杂的

//callback回调函数的使用
{
    let ajax=function (callback) {
        console.log('执行1');
        settimeout(function () {
            callback&&callback.call()
        },1000)
    };
    ajax(function () {
        console.log('timeout')
    })
}

//promise
{
    let ajax=function () {
        console.log('执行2');
        return new promise(function (resolve,reject) {
            settimeout(function () {
                resolve()
            },1000);
        })
    };
    ajax().then(function () {
        console.log('promise','timeout2')
    })
}
{
    let ajax=function () {
        console.log('执行3');
        return new promise(function (resolve,reject) {
            settimeout(function () {
                resolve()
            },1000);
        })
    };
    ajax().then(function () {
        return new promise(function (resolve,reject) {
            settimeout(function () {
                resolve()
            },2000)
        })
    }).then(function () {
        console.log('timeout3')
    })
}
//promise异常捕获
{
    let ajax=function (num) {
       console.log('执行4');
       return new promise(function (resolve, reject) {
           if(num>5){
               resolve()
           }else {
               throw new  error ('出错了')
           }
       })
    };
    ajax(6).then(function () {
        console.log('log',6);
    }).catch(function (err) {
        console.log('catch',err)
    });
    ajax(3).then(function () {
        console.log('log',3);
    }).catch(function (err) {
        console.log('catch',err)
    });
}
//所有的图片都加载完在添加到页面
{
   function loadimg(src) {
       return new promise(function (resolve, reject) {
           let img=document.createelement("img");
           img.src=src;
           img.onload=function () {
               resolve(img)
           }
           img.onerror=function () {
               reject(err);
           }
       })
   }
   function showimg(imgs) {
        imgs.foreach(function (img) {
            document.body.appendchild(img);
        })
   }
   promise.all([
    loadimg(''),
    loadimg(''),
    loadimg('h')
]).then(showimg)
}
//有一个图片加载完就添加到页面
{
    function loadimg(src) {
        return new promise(function (resolve, reject) {
            let img=document.createelement("img");
            img.src=src;
            img.onload=function () {
                resolve(img)
            }
            img.onerror=function () {
                reject(err);
            }
        })
    }
    function showimgs(img) {
        let p=document.createelement("p");
        p.appendchild(img);
        document.body.appendchild(p)
    }
    promise.race([
        loadimg(''),
        loadimg(''),
        loadimg('')
    ]).then(showimgs)
}

14、iterator 接口

//自定义iterator接口
{
    let obj={
        start:[1,3,2],
        end:[7,9,8],
        [symbol.iterator](){
            let self=this;
            let index=0;
            let arr=self.start.concat(self.end);
            let len=arr.length;
            return{
                next(){
                    if(index15、generator
next函数的用法
yeild^*的用法
{
    let obj={};
    obj[symbol.iterator]=function *() {
        yield "1";
        yield "2";
        yield "3"
    }
    for(let value of obj){
        console.log('value',value)
    }
}
15、decorator
       函数 修饰行为 修饰类的行为
       安装插件
       npm install babel-plugin-transform-decorators-legacy --save-dev
       在.babelrc中写入
       常规的修饰都在第三方库中,可以引入
       core-decorators
       可以安装
       npm install core-decorators
       然后通过improt引入

类修饰符

{
    let log=(type)=>{
        return function (target,name,descriptor) {
            let src_method=descriptor.value;
            descriptor.value=(...arg)=>{
                src_method.apply(target.arg);
                console.info(`log ${type}`)
            }
        }
    }
    class ad{
        @log('show')
        show(){
            console.log('ad is show')
        }
        @log('click')
        click(){
            console.log('ad is click')
        }
    }
    let ad =new ad();
    ad.show();
    ad.click()
}

16、模块化

){>