let与const-《ES6 入门教程》阮一峰学习笔记

329 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

前言

最近,因为想要系统地学习一下ES6看到了阮一峰老师的《ES6入门教程》,顿感自己之前所学不够深入不够成体系,故以此文来记录一下其过程中的所思、所学、所想。

let命令

let命令为ES6中新增的声明变量的命令。使用let声明的变量仅在块级作用域中有效,那么为什么需要块级作用域呢?

为什么需要块级作用域

ES5时只有全局作用域以及函数作用域,这样的话在很多场景下其实是会出现问题的。

第一种就是变量的覆盖

var a=1
if (1){
   var a=2
}
console.log(a)  //2

第二种循环时循环变量值存在污染问题

image.png

但是点击时却都是显示第四个,因为点击监听事件是异步执行的,当点击按钮执行相应函数之前,同步任务(循环)已经执行结束,此时在全局作用域下的 i 已经为固定值。执行alert(i)时,沿着作用域链找到全局作用域下的i ,导致点击每个按钮得到的结果相同。但是如果用let声明i,就不会存在此问题。

其实不止有这两个问题,其他诸如函数嵌套、函数中用iffor都会有类似的问题,所以块级作用域是必要的!

let相比var的限制

1.let不存在变量提升

console.log(a)  //undefined
var a=1
console.log(a)  //报错
let a=1

let不存在变量提升,在声明变量前使用就会报错。而此时未声明变量前的区域其实是存在暂时性死区(即使用变量就报错)!

2.let不允许重复声明

let a=1;
let a=2;  //报错

const命令

constlet大致相似,都不存在变量提升(存在暂时性死区)、重复定义,拥有块级作用域。但const用来声明常量,let用来声明变量,且const定义的值不能修改。

但若用const定义对象,因为对象的变量保存的是地址值,所以是可以修改对应对象的属性值,但不可直接对其本身变量赋值(会报变量已定义的错)

const a={name:"tom",age:12}
a.name="daming"
const a="tom"  //报错Identifier 'a' has already been declared  

总结

总的来看,定义变量时就用let,定义常量时就用const。而且现在的数据类型多以对象以及数组居多,所以const的使用是更为频繁的!