ES6 语法

Posted addie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6 语法相关的知识,希望对你有一定的参考价值。

一、let和const

es6新增加了块作用域,也就是{}包起来的代码。

function test(){
  let a = 0;
  const b = 0;        
}

const常量不能修改,并且声明常量必须赋值!

const和let的唯一区别就是,const不可以被更改,所以当声明变量的时候,尤其是在声明容易被更改的全局变量的时候,尽量使用const。

  • 更好的代码语义化,一眼看到就是常量。
  • 另一个原因是因为javascript 编译器对const的优化要比let好,多使用const,有利于提高程序的运行效率。
  • 所有的函数都应该设置为常量。

二、解构赋值

解构赋值的分类:数组结构赋值(左右都是数组)、对象结构赋值(左右都是对象)、字符串结构赋值(左数组、右字符串)、布尔值结构赋值、函数参数解构赋值(数组解构赋值在函数上的引用)、数值解构赋值。

{
    let a,b,rest;
    [a, b]=[1,2];
    console.log(a);//1
    console.log(b);//2
}
{
    let a,b,rest;
    [a, b, ...rest]=[1,2,3,4,5,6];
    console.log(a, b, rest);//1 2 [3,4,5,6]
}
{
    let a,b;
    ({a, b}={a:1,b:2});
    console.log(a, b);//1,2
}
{
    let a,b,c,rest;
    [a, b,c = 3]=[1,2];
    console.log(a, b, c);//1 2 3
}

 

如果c没有赋值,找不到可以配对的值,c就是undifined。
适用场景:变量交换,选择性获取返回值。

 

{
    let a=1;
    let b=2;
    [a, b]=[b,a];
    console.log(a, b);//2 1
}
{
    function f() {
       return [1,2];
    }
    let a,b;
    [a, b]=f();//1 2
}
{
    function f1() {
        return [1,2,3,4,5];
    }
    let a,b,c;
    [a, , ,b]=f1();
    console.log(a, b);//1 4
}
{
    function f1() {
        return [1,2,3,4,5];
    }
    let a,b,c;
    [a,...b]=f1();
    console.log(a, b);//1 [2,3,4,5]
}

 

上面这两种也可以混合使用。
在用到数组成员对变量赋值时,尽量使用解构赋值。
对象的解构赋值::

 

{
    let o={p:42,q:true};
    let {p,q}=o;
    console.log(p, q);//42 true
}
{
    let {a=10,b=5}={a:3};
    console.log(a, b);//3 5  a=10是默认值,找不到匹配项时才=10
}

 

使用场景:

{
    let metaData={
        title: ‘abc‘,
        test: [{
            title: ‘test‘,
            desc: ‘description‘
        }]
    };
    let {title:esTitle,test:[{title:cnTitle}]} = metaData;
    console.log(esTitle,cnTitle);//abc test
}

 

函数的参数如果是对象的成员,优先使用解构赋值。
如果函数返回多个值,优先使用对象的解构赋值,而不是数组的解构赋值。这样便于以后添加返回值,以及更改返回值的顺序。

 

三、正则扩展

正则新增特性:u修饰符、y修饰符、s修饰符。

{
    //es5
    let regex=new RegExp(‘xyz‘,‘i‘);
    let regex2=new RegExp(/xyz/i);//或者直接/xyz/i
    console.log(regex.test(‘xyz123‘));//true
    console.log(regex2.test(‘xyz123‘));//true

    //es6,参数可以下面这样
    let regex3=new RegExp(/xyz/ig,‘i‘);
    console.log(regex3.flags);//i 即第二个参数的修饰符会覆盖前面正则表达式的修饰符
}
{
    //y修饰符 vs g修饰符
    let s=‘bbb_bb_b‘;
    let a1=/b+/g;
    let a2=/b+/y;
    console.log(‘one‘,a1.exec(s),a2.exec(s));//bbb bbb
    console.log(‘two‘,a1.exec(s),a2.exec(s));//bb null
    //相同点:都是全局匹配
    //不同点:g是上一次匹配的下一个字符开始,即_,不强调在第一个字符就能匹配上
    //不同点:y是上一次匹配的下一个字符开始,即_,但是必须得在第一个字符就能匹配上
    console.log(a1.sticky,a2.sticky);//false true 是否开启y
}
{
    //u修饰符:unicode
    console.log(‘u-1‘,/^uDB3D/.test(‘uDB3DuDC2A‘));//u-1 true //uDB3DuDC2A当成两个字符
    console.log(‘u-2‘,/^uDB3D/u.test(‘uDB3DuDC2A‘));//u-2 false //uDB3DuDC2A当成一个字符

    console.log(/u{61}/.test(‘a‘));//false
    console.log(/u{61}/u.test(‘a‘));//true

    console.log(`u{20BB7}`);//unicode编码大于FFFF,即大于两个字节
    let s=‘??‘;
    console.log(/^.$/.test(s));//false
    console.log(/^.$/u.test(s));//true

    console.log(‘test‘,/??{2}/.test(‘????‘));//test false
    console.log(‘test2‘,/??{2}/u.test(‘????‘));//test2 true
    //总结,大于两个字节长度的字符,要加u
    //但是仍然不能匹配换行符,回车符,行分隔符,段分隔符
    //如果要能匹配,使用s修饰符,但是s修饰符es6尚未实现
}

 

四、字符串扩展

安装补丁库,处理兼容:npm install babel-polyfill --save-dev
需要引入兼容库

import ‘babel-polyfill‘;
{
    console.log(‘a‘,‘u0061‘);//a a
    console.log(‘a‘,‘u20BB7‘);//a ?7 超过了0xFFF,即两个字节,会被当成两个字符
    console.log(‘s‘,`u{20BB7}`);//s ??
}
{
    let s=‘??‘;
    //es5
    console.log(‘length‘,s.length);//2 (码字大于两个字节,当四个字节处理,计算长度的时候每两个字节算一个长度)
    console.log(‘0‘,s.charAt(0));//0 乱码
    console.log(‘0‘,s.charAt(2));//0 乱码
    console.log(‘at0‘,s.charCodeAt(0));//at0 55362
    console.log(‘at1‘,s.charCodeAt(1));//at0 57271
    //es6
    let s1=‘??a‘;
    console.log(‘length‘,s1.length);//3
    console.log(‘code0‘,s1.codePointAt(0));//134071 取出4个字节
    console.log(‘code0‘,s1.codePointAt(0).toString(16));//20bb7
    console.log(‘code1‘,s1.codePointAt(1));//57271 取出后两个字节
    console.log(‘code1‘,s1.codePointAt(2));//97 就是a
    //.toString(16)转成16进制
}
{
    //es5
    console.log(String.fromCharCode(‘0x20BB7‘));//乱码
    //es6
    console.log(String.fromCodePoint(‘0x20BB7‘));//??
}
{
    let str=‘u{20BB7}abc‘;
    for (let i=0;i<str.length;i++){
        console.log(‘es5‘,str[i]);//前两个乱码 a b c
    }
    for (let code of str){
        console.log(‘es6‘,code);//?? a b c
    }
}
{
    let str=‘string‘;
    console.log(‘includes‘,str.includes(‘r‘));//true
    console.log(‘start‘,str.startsWith(‘str‘));//true
    console.log(‘end‘,str.endsWith(‘ng‘));//true
}
{
    let str=‘abc‘;
    //es5是用+
    console.log(str.repeat(2));//abcabc
}
//模板字符串
{
    let name=‘list‘;
    let info=‘hello world‘;
    let m=`i am ${name},${info}`;
    console.log(m);//i am list,hello world
    console.log(‘1‘.padStart(2,‘0‘));//01
    console.log(‘1‘.padEnd(2,‘0‘));//10
}
//标签模板:防止XSS攻击,处理多语言
{
    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);//["i am ", ",", "",] "list" "hello world"
        return s+v1+v2;//i am ,,,listhello world
    }
}
{
    console.log(String.raw`Hi
${1-2}`);//Hi 
-1
    console.log(‘Hi
${1+2}‘);//Hi 换行 ${1+2}
}

 

五、数值扩展

{
    console.log(0b11110111);//247 0b二进制(大小写均可)
    console.log(0o11111);//4681 0o八进制(大小写均可)
}
{
    console.log(‘15‘,Number.isFinite(15));//true
    console.log(‘NaN‘,Number.isFinite(NaN));//false
    console.log(‘1/0‘,Number.isFinite(1/0));//false
    console.log(‘NaN‘,Number.isNaN(NaN));//true
    console.log(‘0‘,Number.isNaN(0));//false

    console.log(‘25‘,Number.isInteger(25));//true
    console.log(‘25.0‘,Number.isInteger(25.0));//true 25.0=25
    console.log(‘25.1‘,Number.isInteger(25.1));//false
    console.log(‘25.0‘,Number.isInteger(‘25.0‘));//false

    console.log(Number.MAX_SAFE_INTEGER);
    console.log(Number.MIN_SAFE_INTEGER);
    console.log(Number.isSafeInteger(10));//true 是否位于上面两个数的范围内
    console.log(Number.isSafeInteger(‘a‘));//false

    //es5:Math.floor,Math.ceil
    console.log(4.1,Math.trunc(4.1));//4
    console.log(4.9,Math.trunc(4.9));//4

    console.log(‘-5‘,Math.sign(-5));//-1
    console.log(‘5‘,Math.sign(5));//1
    console.log(‘0‘,Math.sign(0));//0
    console.log(‘a‘,Math.sign(‘a‘));//NaN

    //开立方根
    console.log(Math.cbrt(-1));//-1
    console.log(Math.cbrt(8));//2
}

 

以上是关于ES6 语法的主要内容,如果未能解决你的问题,请参考以下文章

ES6解构

React使用ES6语法重构组件代码

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误

总结常见的ES6新语法特性

es6的一些基本语法

30秒就能看懂的JavaScript 代码片段