ES6,小笔记

拜读了阮大神的 《ECMAScript 6入门》 一书,非常易懂,做一下笔记。

一、什么是ES6?
        ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

二、ES6和ECMAScript 2015有什么关系?
        ES6 的第一个版本,2015年6月发布,正式名称就是《ECMAScript 2015标准》(简称 ES2015)。
        ES6 既是一个历史名词,也是一个泛指,含义是5.1版以后的 JavaScript 的下一代标准,涵盖了ES2015、ES2016、ES2017等等。
        而ES2015 则是正式名称,特指该年发布的正式版本的语言标准。一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。

三、什么是Babel转码器?
        Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持。

四、ES6新增了什么?
        1、变量和变量的作用域(定义变量加入了 let const)
        2、解构赋值
        3、字符串的扩展
        4、正则的扩展
        5、数值的扩展
        6、数组的扩展
        7、函数的扩展
        8、对象的扩展
        9、Symbol
      10、Set 和 Map 数据结构
      11、Proxy
      12、Reflect
      13、Promise 对象
      14、Iterator 和 for...of 循环
      15、Generator 函数的语法
      16、Generator 函数的异步应用
      17、async 函数
      18、Class
      19、Decorator
      20、Module 的语法
      13、Module 的加载实现
      14、Iterator 和 for...of 循环
      15、Generator 函数的语法
      16、Generator 函数的异步应用
      17、async 函数

五、什么是let?
        ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
        for循环的计数器,就很合适使用let命令。

六、let有哪些特性?
        1、let声明的变量只在它所在的代码块有效。
        

   
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
a  // ReferenceError: a is not defined.
b  // 1
//2
for  ( let  i  =  0 ;  i  <  10 ;  i ++ )  { }
console . log ( i ) ;
//ReferenceError: i is not defined
//ifor
//3
var  a  =  [ ] ;
for  ( var  i  =  0 ;  i  <  10 ;  i ++ )  {
   a [ i ]  =  function  ( )  {
     console . log ( i ) ;
   } ;
}
a [ 6 ] ( ) ;  // 10
//ivarii
//4
var  a  =  [ ] ;
for  ( let  i  =  0 ;  i  <  10 ;  i ++ )  {
   a [ i ]  =  function  ( )  {
     console . log ( i ) ;
   } ;
}
a [ 6 ] ( ) ;  // 6
//iletii6i JavaScript i
//5
for  ( let  i  =  0 ;  i  <  3 ;  i ++ )  {

        2、不存在变量提升(声明提前)
        let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
        

   
1
2
3
4
5
6
7
8
9
10
// var 
console . log ( foo ) ;  // undefined
var  foo  =  2 ;
// let 
console . log ( bar ) ;  // ReferenceError
let  bar  =  2 ;
//foovarfooundefinedbarletbar

        3、暂时性死区
        ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
        也就是说,凡是let 存在的块级作用域,他所声明的变量,不再与作用域外的同名变量有关系,并且,在作用域内let声明之前使用此变量,也会报错。
        let一旦出现,使用变量就必须遵从let,并且在let之后。对外,将在外,君令有所不受;对内,非令不行。

        “暂时性死区”也意味着typeof不再是一个百分之百安全的操作。
        在没有let之前,如果一个变量根本没有被声明,使用typeof反而不会报错。
          typeof undeclared_variable // "undefined"
        在使用let后,
           typeof x; // ReferenceError
           let x;
        变量x使用let命令声明,所以在声明之前,都属于x的“死区”,只要用到该变量就会报错。因此,typeof运行时就会抛出一个ReferenceError。

        ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
        总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
        4、不允许重复声明
        let不允许在相同作用域内,重复声明同一个变量。因此,不能在函数内部重新声明参数。

   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 
function  ( )  {
   let  a  =  10 ;
   var  a  =  1 ;
}
// 
function  ( )  {
   let  a  =  10 ;
   let  a  =  1 ;
}
function  func ( arg )  {
   let  arg ;  // 
}
function  func ( arg )  {
   {
     let  arg ;  // 
   }
}

七、块级作用域
        1、为什么需要块级作用域?
        ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
        第一种场景,内层变量可能会覆盖外层变量。

   
1
2
3
4
5
6
7
8
9
10
var  tmp  =  new  Date ( ) ;
function  f ( )  {
   console . log ( tmp ) ;
   if  ( false )  {
     var  tmp  =  "hello world" ;
   }
}
f ( ) ;  // undefined

        上面代码中,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。

        第二种场景,用来计数的循环变量泄露为全局变量。

   
1
2
3
4
5
6
7
var  s  =  'hello' ;
for  ( var  i  =  0 ;  i  <  s . length ;  i ++ )  {
   console . log ( s [ i ]) ;
}
console . log ( i ) ;  // 5

        上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
        2、ES6的块级作用域
                  
  1. ES6允许块级作用域的任意嵌套。外层作用域无法读取内层作用域的变量。
  2. 内层作用域可以定义外层作用域的同名变量。
  3. 块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
    
         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // IIFE 
    ( function  ( )  {
       var  tmp  =  ...;
       ...
    } ( )) ;
    // 
    {
       let  tmp  =  ...;
       ...
    }
  4. ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
  5. 考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
    
         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 
    {
       let  a  =  'secret' ;
       function  f ( )  {
         return  a ;
       }
    }
    // 
    {
       let  a  =  'secret' ;
       let  f  =  function  ( )  {
         return  a ;
       } ;
    }

        3、do 表达式
       本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。在块级作用域以外,没有办法得到t的值,因为块级作用域不返回值,除非t是全局变量。
       现在有一个提案,使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do,使它变为do表达式。

   
1
2
3
4
let  x  =  do  {
   let  t  =  f ( ) ;
   t  *  t  +  1 ;
} ;

       上面代码中,变量x会得到整个块级作用域的返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值