ES6 let 和 const

ES6新增加了两个重要的 JavaScript 关键字: let 和 const。

let 声明的变量只在 let 命令所在的代码块内有效。let实际上为 JavaScript 新增了块级作用域。

const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。


首先我们要知道块级作用域:任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

ES5 只有全局作用域和函数作用域,没有块级作用域,块级作用域是ES6出现的一个概念。


1.代码块内有效

let 是在代码块内有效,var 是在全局范围内有效。

{
    let a = 1;
    var s = 2;
}
console.log(a);
//报错 ReferenceError: a is not defined
console.log(s);   //2
//let是在代码块内有效,var在全局范围内有效

2.不能重复声明

let在相同的作用域内只能声明一次 ,var 可以声明多次。

let a = 1;
let a = 10;
var s = 2;
var s = 20;
console.log(a);
//报错 Identifier 'a' has already been declared
console.log(s);   //20
//let 只能声明一次 var 可以声明多次

3.不存在变量提升

let ,const不存在变量提升,var 会变量提升。

首先说一下什么是变量提升:函数及变量的声明都将被提升到函数的最顶部。注意JavaScript并不是严格的自上而下云习惯的语言。

console.log(a);  //ReferenceError: a is not defined
let a = "hello";
console.log(d); //ReferenceError: d is not defined
const d = "good";
//let,const不存在变量提升
console.log(s);  //undefined
var s = "javascript";
//var存在变量提升。即当脚本开始运行的时候,b这个变量已经存在了,但是还没有赋值,所以会输出 undefined。

4.暂时性死区

var s = "a";
if(true){          //这是一个封闭的作用域
  console.log(s);  // ReferenceError: s is not defined 
  const s = "3.1415926";
  console.log(s);  // 3.1415926
  //存在全局变量s,但是块级作用域内const又声明了一个局部变量s,导致后者绑定这个块级作用域,所以在const声明变量前,对s赋值会报错。
//上面代码中,在const命令声明变量s之前,都属于变量s的“死区”。
}

ES6 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

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

 5.const对数组和对象的元素修改不算作对常量的修改。

    const GROUPS =["tom","jerry","jack"];
    GROUPS.push("sun");
    console.log(GROUPS);
    //合法的,GROUPS数组修改为["tom","jerry","jack","sun"]

const 做到变量在声明初始化之后不允许改变是因为const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。并且默认常量使用大写。

ES6有六种声明变量的办法:var,let,const,function,import,class。

原文地址:https://www.cnblogs.com/JZN-dhy/p/13227670.html