let、const

1、ECMAScript 6

javascript组成: ECMAScript、BOM、DOM

ES6指的是ECMAScript的版本,2015年6月正式通过

2、let命令

用法类似于var,但是所声明的变量只在let命令所在的代码块内有效

   var b = new Array()
   for (let i = 0; i < 3; i++) {
       b[i] = i
   }
   console.log(i)

报错:Uncaught ReferenceError: i is not defined

但是,换成var会正常输出 3

js作用域,不像其他大部分语言都是块作用域,它是函数作用域,只有函数里声明的变量才是局部变量,外部不能引用,而if、for等语句块中的变量,从声明开始直至销毁都是全局的。因此,有些地方使用var会觉得有点“坑”,增加了let命令之后,相当于给js增加了块级作用域,可以避免

var a = new Array()
   for(var i=0;i<6;i++){
    a[i] = function(){
        console.log(i)
    }
   }
a[3]();

//输出  6

上述代码中,i使用var声明的,并且是在语句块中,所以它是全局变量,每一次循环,变量的i值都会发生改变,而循环内的i指向的也是全局变量i,而执完循环体后,i的值为6,所以最后console.log(i)的输出也是6  

var a = new Array()
   for(let i=0;i<6;i++){
    a[i] = function(){
        console.log(i)
    }
   }
   a[3]()

//输出3

上述代码唯一的区别就是,i使用let声明。由于i是在块内起作用,也就是本次的循环中有效,所以每一次循环都会开辟一个新的地址存放,并且,js引擎会记住上一次的值,初始化本轮的变量i时,就会使用上一次i的值。所以最终输出的是 3

let无变量提升,也就是必须先声明再使用,否则会报错。ES6规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量从一开始就形成了封闭作用域。

let不允许在相同作用域内,重复声明同一个变量

3、const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。其本质是变量指向的地址不允许改动,针对数字、字符串、布尔值,值就保存在变量指向的内存地址,因此等同于常量,但对于复合类型的数据,主要是对象和数组,变量指向的内存地址是指针,其数据结构可以变。所以将对象或数组声明为const需要注意,其内容不一定是不变的。

const a;
a = 11;
console.log(a)
//输出报错 Uncaught SyntaxError: Missing initializer in const declaration

const常量,声明后必须赋值,并且对于简单的数据类型是不可以更改,但对于复杂数据类型,可以增减内容,但是不能改变地址

const a = 11;
a = 12;
console.log(a)
//Uncaught TypeError: Assignment to constant variable.

const b = {m:33}
b.n = 22
console.log(b)
// {m: 33, n: 22}

  const c = [1,2,3,4];
  let b = [1,2,3,4];
  c = b;
  console.log(c)

  // Uncaught TypeError: Assignment to constant variable.

原文地址:https://www.cnblogs.com/tiantianxiangshang33/p/7365687.html