es6

Posted mataoblogs

tags:

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

一、let

我们先看var,例如:

1 <script type="text/javascript">
2         function test(){
3             for(var i=1;i<3;i++){
4                 console.log(i);
5             }
6             console.log(i);
7         }
8             test();
9 </script>

浏览器结果:

技术图片

如果将var改成let

1 <script type="text/javascript">
2         function test(){
3             for(let i=1;i<3;i++){
4                 console.log(i);
5             }
6             console.log(i);
7         }
8             test();
9 </script>

此时浏览器的结果会报错:

技术图片

这是因为let所在的块(3,4,5行)在作用域之外(花括号之外)不存在了,es6强制开启严格模式。let声明的变量只在局部作用域内有效

let声明的变量,只能生成一次,不能重复创建。例如:

1 <script type="text/javascript">
2         function test(){
3             let a = 1;
4             let a = 2;
5             console.log(a);
6         }
7             test();
8 </script>

浏览器会报错:

技术图片

二、const

const声明的常量不能修改,而且必须赋值否则会报错

1 <script type="text/javascript">
2         function test(){
3             const PI = 3.1415926;
4             //PI = 3; //加上此句会报错
5             console.log(PI);
6         }
7             test();
8 </script>

但是我们要注意的是:const声明的如果是对象,则其值是可以修改的,例如:

 1 <script type="text/javascript">
 2         function test(){
 3             const PI = 3.1415926;
 4             const k = {
 5                 a:1
 6             }
 7             k.b = 3;
 8             console.log(PI,k);
 9         }
10             test();
11 </script>

浏览器结果:

技术图片

其实const声明的值不是不可以改变,而是该变量指向的内存地址不能改变,在声明为一个常量的时候,变量的指针就是指向该常量,常量改变地址指向改变,所以会报错

三、解构赋值

数组解构赋值:

1 <script type="text/javascript">
2     {
3         let a,b,rest;
4         [a,b] = [1,2];
5         console.log(a,b);
6     }
7 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2     {
3         let a,b,rest;
4         [a,b,...rest]=[1,2,3,4,5,6];
5         console.log(a,b,rest);
6     }
7 </script>

浏览器结果:

技术图片

对象解构赋值:

1 <script type="text/javascript">
2     {
3         let a,b;
4         ({a,b} = {a:1,b:2});
5         console.log(a,b);
6     }
7 </script>

浏览器结果:

技术图片

数组解构赋值和对象解构赋值的使用:

1 //默认值
2 <script type="text/javascript">
3         {
4             let a,b,c,rest;
5             [a,b,c=3]=[1,2];
6             console.log(a,b,c);
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         //变量交换
3         {
4             let a=1;
5             let b=2;
6             [a,b]=[b,a];
7             console.log(a,b);
8         }
9 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             function f() {
 4                 return [1,2]
 5             }
 6             let a,b;
 7             [a,b]=f();
 8             console.log(a,b);
 9         }
10 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             function f() {
 4                 return [1,2,3,4,5]
 5             }
 6             let a,b,c;
 7             [a,,,b]=f(); //三个逗号之间的2和3不显示
 8             console.log(a,b);
 9         }
10 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             function f() {
 4                 return [1,2,3,4,5]
 5             }
 6             let a,b,c;
 7             [a,...b]=f(); //2,3,4,5组成一个数组
 8             console.log(a,b);
 9         }
10 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             function f() {
 4                 return [1,2,3,4,5]
 5             }
 6             let a,b,c;
 7             [a,,...b]=f(); //3,4,5组成一个数组
 8             console.log(a,b);
 9         }
10 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let {a=10,b=5}={a:3};
4             console.log(a,b);
5         }
6 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             let metaData={
 4                 title:abc,
 5                 test:[{
 6                     title:test,
 7                     desc:description
 8                 }]
 9             }
10             let {title:esTitle,test:[{title:cnTitle}]}=metaData;
11             console.log(esTitle,cnTitle);
12         }
13 </script>

浏览器结果:

技术图片

四、正则扩展

 1 <script type="text/javascript">
 2         {    //es5中的两种方式
 3             let regex=new RegExp(xyz,i);//es5中两个参数的,第一个参数必须是字符串
 4             let regex2=new RegExp(/xyz/i);//es5中一个参数的
 5 
 6             console.log(regex.test(xyz123),regex2.test(xyz123));
 7 
 8             let regex3=new RegExp(/xyz/ig,i);//es6中第二个修饰符i会覆盖第一个修饰符,所以输出结果为i
 9             console.log(regex3.flags);// flags用来获取修饰符的属性
10         }
11 </script>

浏览器结果:

技术图片

y修饰符

 1 <script type="text/javascript">
 2         {
 3             let s=bbb_bb_b;
 4             let a1=/b+/g;
 5             let a2=/b+/y;
 6 
 7         console.log(one,a1.exec(s),a2.exec(s));//第一次匹配结果一致都为bbb
 8         console.log(one,a1.exec(s),a2.exec(s));//第二次匹配y返回null因为搜索到下横杠_认为不是b,所以返回null
 9 
10         }
11 </script>

浏览器结果:

技术图片

gy都是全局匹配,g后面的若不是要匹配的项,会继续匹配直到找到要匹配的项为止,而y后面紧跟着的若不是要匹配的项,则返回none

 1 <script type="text/javascript">
 2         {
 3             let s=bbb_bb_b;
 4             let a1=/b+/g;
 5             let a2=/b+/y;
 6 
 7             //console.log(‘one‘,a1.exec(s),a2.exec(s));
 8             //console.log(‘one‘,a1.exec(s),a2.exec(s));
 9 
10             console.log(a1.sticky,a2.sticky);//a1未开启粘连模式(也就是y修饰符)a2开启了粘连模式
11         }
12 </script>

浏览器结果:

技术图片

XXXX.sticky:是否开启y粘连模式(也就是y修饰符)

1 <script type="text/javascript">
2         {
3             console.log(u-1,/^\\uD83D/.test(\\uD83D\\uDC2A));//未加u可理解为会把test中的部分按两个字符进行处理
4             console.log(u-2,/^\\uD83D/u.test(\\uD83D\\uDC2A));//加u可理解为把他们当成一个字符进行处理,所以匹配不到
5 
6         }
7 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             console.log(`\\u{20BB7}`);
 4 
 5             let s=??;
 6 
 7             console.log(u,/^.$/.test(s));
 8             console.log(u-2,/^.$/u.test(s));
 9 
10             console.log(test,);
11         }
12 </script>

浏览器结果:

技术图片

五、字符串扩展

<script type="text/javascript">
        {
            console.log(a,`\\u0061`);
            console.log(s,`\\u20BB7`);

            console.log(s,`\\u{20BB7}`);
        }
</script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             let s=??;
 4             console.log(length,s.length);
 5 
 6             console.log(0,s.charAt(0));
 7             console.log(1,s.charAt(1));
 8 
 9             console.log(at0,s.charCodeAt(0));
10             console.log(at1,s.charCodeAt(1));
11         }
12 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         {
 3             let s1=??a;
 4             console.log(length,s1.length);
 5             console.log(code0,s1.codePointAt(0)); //十进制
 6             console.log(code0,s1.codePointAt(0).toString(16)); //转换成16进制
 7             console.log(code1,s1.codePointAt(1));
 8             console.log(code2,s1.codePointAt(2));
 9         }
10 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             console.log(String.fromCharCode("0x20bb7"));
4         //es5中用fromCharCode
5             console.log(String.fromCodePoint("0x20bb7"));
6         //es6中用fromCodePoint
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let str=\\u{20bb7}abc;
4             for(let i=0;i<str.length;i++){  //es5中的遍历
5                 console.log(es5,str[i]);
6             }
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let str=\\u{20bb7}abc;
4             for(let code of str){  //es6中的遍历
5                 console.log(es6,code);
6             }
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let str="string";
4             console.log(includes,str.includes("c"));//判断str这个字符串中是否有c
5             console.log(start,str.startsWith(str));//判断字符串是否是str开始的
6             console.log(end,str.endsWith(ng));//判断字符串是否是已g结束的
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let str="abc";
4             console.log(str.repeat(2));//repeat重复,打印字符串两次
5         }
6 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             let name="list";
4             let info="hello world";
5             let m=`i am ${name},${info}`;//必须在`符号之间
6             console.log(m);
7         }
8 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             console.log(1.padStart(2,0));//补白,在前面补,把0补到1的前面
4             console.log(1.padEnd(2,0));//补白,在后面补,把0补到1的后面
5         }
6 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         //标签模板:处理多语言转换
 3         {
 4             let user={
 5                 name:list,
 6                 info:hello world
 7             };
 8             abc`i am ${user.name},${user.info}`;
 9             function abc(s,v1,v2) {
10                 console.log(s,v1,v2);
11             }
12         }
13 </script>

浏览器结果:

技术图片

 1 <script type="text/javascript">
 2         //标签模板:处理多语言转换
 3         {
 4             let user={
 5                 name:list,
 6                 info:hello world
 7             };
 8             console.log(abc`i am ${user.name},${user.info}`);
 9             function abc(s,v1,v2) {
10                 console.log(s,v1,v2);
11                 return s+v1+v2
12             }
13         }
14 </script>

浏览器结果:

技术图片

1 <script type="text/javascript">
2         {
3             console.log(String.raw`Hi\\n${1+2}`);//对换行符\\n进行了转义
4             console.log(`Hi\\n${1+2}`);//没有转义所以会换行
5         }
6 </script>

浏览器结果:

技术图片

六、数值扩展

 

  

 

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

ES6 模块串联

ES6解构赋值

ES7-Es8 js代码片段

JavaScript ES6 的let和const

VScode插件推荐

没有名称的Javascript ES6导入[重复]