let && const

如需转载请注明来源

关键词:let , const

let

介绍一下let的特性:

  1. let不存在变量提升:它是按照解析顺序来赋值的
console.log(a)
let a= 0;//报错
  1. 使用let会存在暂时性死区(TDZ : temporal dead zone)

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var t = 0;
  var a = 'aaa';
  {
    console.log(a)
    t++;
    let t = 99;
  }
//先打出'aaa',之后是'ReferenceError: t is not defined',
//报错的原因在于t++;这个语句。let 将会提升这个变量到语句块的顶部。
//然而,在这个语句块中,在变量声明之前引用这个变量会导致一个 的结果, 因为let变量 在"暂存死区" (从块的开始到声明这段).
  1. let不允许重复声明:
{
  var a=0;
  let a=1;
//报错
}
{
  let a=0;
  let a=1;
}
//报错

块级作用域

记得在学作用域的时候ES5之前规定只有函数作用域和全局作用域,ES6之后规定可以有块级作用域(if,switch,for,while的大括号都是块级作用域),现在我们可以使用let或者const来触发块级作用域

{
  let a = 0;
  const b =1;
}
  console.log(a)
  console.log(b)
//报错,因为let或者const触发了块级作用域,可以把大括号看成一个作用域,外部访问不到内部。

基于块级作用域和let的特性我们可以放弃以前的立即执行函数的写法,换成:

{
  let fn = function(){
      //dosomething
  }
  fn();
}

const

const具有let以上的所有特性,在此我们主要了解const和let的不同:

const声明一个只读的常量。一旦声明,常量的值就不能改变。这不意味着常量指向的值不可变

const与let最大的区别是,你可以操作let的值,而const只要定义下来就不能去改变它

  const a=0;
  a++;//报错 "TypeError: Assignment to constant variable."

但是,如果const存的指针指向的是一个对象的话,对象是可以改变,但是const存的指针不能改变~~~

const a={};
a.name='lwk';
console.log('lwk')
//可行,打印出lwk
a={ name:'lwk' };
//报错~~因为改变了指针

你可能感兴趣的:(let && const)