ES6 变量、常量声明总结

 

前言

比前ES5,新本子在宣称上发变动,现因文档教程,总结下不同之处,时长温习。

 

一、var  对比  let

  1、作用域不同

    let只于指令所在的代码块 {} 里有效

    ES5仅发大局作用域和函数作用域,没有块级作用域,带来许多免成立之景,比如:

    第一种植现象,内层变量可能会见蒙外层变量。

    

var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined

    上面代码的本心是,if代码块的标使用外层的tmp变量,内部使用内层的tmp变量。但是,函数f履后,输出结果为undefined,原因在变量提升,导致内层的tmp变量覆盖了外围的tmp变量。

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

    

var s = 'hello';

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5

    上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。


   ES6的块级作用域可以多个嵌套,外层作用域无法访问内层作用域,内层作用域可以声明外层作用域的参数。
  
  另外,ES6标准也运行在块级作用域下声明函数,而作用域外不可以引用,函数声明是类似于var还是let,歌浏览器可能有自己的处理方式,
所以暂时不建议在块级作用域下声明函数

  块级作用域是一个语句,里面封装了若干语句,没有返回值,现在有一个提案,使得块级作用域可以变为表达式,也就是说可以返回值,
办法就是在块级作用域之前加上do,使它变为do表达式。

    

  2、let 不在变量提升

  3、let 存在小死区

    ES6明确规定,如果区块中设有letconst指令,这个节对这些命令声明的变量,从平开始就形成了封门作用域。凡是在宣称前即应用这些变量,就会报错。

总的说来,在代码块内,使用let命声明变量之前,该变量都是免可用之。这当语法上,称为“暂时性死区”(temporal
dead zone,简称 TDZ)。

    ES6
规定临时死区和letconst晓句不出新变量提升,主要是为了削减运作时不当,防止在变量声明前即动这变量,从而致使预期之外的行为。这样的错误在
ES5 是杀广阔的,现在发出了这种规定,避免此类错误就是非常容易了。

    总之,暂时性死区的本来面目就是是,只要同进入时作用域,所设下的变量就既是了,但是不可得,只有等交声明变量的那么一行代码出现,才得抱和采取该变量。

  4、let 不同意再声明变量

    注意:不可知于函数里又声明参数,会报错

 

二、const 命令

  ES5没有常量的定义,ES6新增加常量

  const
命令声明一个单独念之常量,一旦声明,值未得以变动,改变会报错;只声明非赋值也会报错。

  作用域与let 相同,只当所在块级作用域内中,其他的特点也同

  本质上,const
实际上保证的并无是变量的价不得以改变,而是变量指向的十分内存地址不得以变动,

  对于简易类型的数目(数价、字符串、布尔值),值就保留在变量指向的要命内存地址,因此等同于常量。

  但对于复合类型的数(主要是目标以及数组),变量指向的内存地址,保存之就是一个指针,const不得不管是指针是一贯的,至于她对的数据结构是免是可变的,就全无能够说了算了。因此,将一个目标声明也常量必须特别小心。  

 

其三、ES6声明变量的6挨方法

  (ES5单纯发生 var 和function 函数声明两栽方式)

  1、ES6 声明方式来var、 let、const、function、import、class

     inport、class 方式的扬言留坑,待填。

 

  以上内容参照阮一峰先生的《ECMAScript
6 入门》,会无期更新;

  另外分享群
    651308349    为前端技术交流群,欢迎大家加入