ES6中的let和const

Posted qncsssznds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6中的let和const相关的知识,希望对你有一定的参考价值。

letconst是ES6新增的几种变量声明方式中的两种,本篇就来谈谈这两种声明方式有什么特点。

一、let、const和var的区别

let和const的使用方式和var没有区别。但是用let和const声明出的变量,使用规则有所不同,let和const多了一些对变量的限制:

1、let和const在同一作用域下不允许重复声明变量。

var声明的变量重复声明有效。

var a = 0;
console.log( a );// 0
var a=1;
console.log( a );// 1

但是用letconst声明的变量,无论用什么声明方式重复声明都会报错

let a = 0;
console.log( a);
var a = 1;
console.log( a );
// Uncaught SyntaxError: Identifier 'a' has already been declared

2、let和const声明的变量不会预解析(没有声明提升)。

虽然a在声明之前的值为undefined,但是不会报错

console.log( a );// undefined
var a = 1;

而用let声明的变量a,如在声明前使用会报错。

console.log( a );
let a = 1;
// Uncaught ReferenceError: Cannot access 'a' before initialization

这是因为let的声明之中多出了一个概念:
TDZ:Temporal Dead Zone,即暂时性死区。在变量声明的作用域之中,不允许在变量声明之前使用这个变量,它锁死了这个作用域声明之前的所有区域使用这个变量的权限。

3、let和const声明的变量存在块级作用域。

块级作用域:ES5中只有全局作用域和函数作用域,而ES6多了块级作用域这个概念,它规定所有的大括号{}都是作用域。
如for循环里var 声明的i,在全局作用域中可以获取。

for(var i = 0; i < 10; i++ ){}
console.log( i );// 10

for循环里let声明的i,在全局作用域中无法获取。

for(let i = 0; i < 10; i++ ){}
console.log( i );// Uncaught ReferenceError: i is not defined

因为let 声明的j的作用域只在for循环之中,这对if等语句的{},同样效果。

二、let和const的区别

1、let声明的时候可以不赋值

let a;//undefined

const声明的时候必须赋值。

const a;//Uncaught SyntaxError: Missing initializer in const declaration. const声明中缺少初始值设定项

2、let声明的变量可以改变,const声明的变量不能被改变。

let a = 10;
a = 20;
console.log( a );// 20
const b = 10;
b = 20;
// Uncaught TypeError: Assignment to constant variable. 未捕获类型错误:分配给常量变量。

但是当const声明的变量是一个地址的时候,这个地址存放的值是可以改变的。
比如我们用const声明的是一个数组或对象,其值是可以改变的:

const b = [10, 1];
b[1] = 20;
console.log( b[1] );// 20
const obj = {};
obj.a = 10;
console.log( obj );// {a: 10}

这是值传递数据和引用传递数据的区别。

以上是关于ES6中的let和const的主要内容,如果未能解决你的问题,请参考以下文章

ES6中的let和const命令

ES6中的let和const

ES6中的let和const

ES6中的let和const

详解ES6中的 let 和const

let和const在es6中的异同点