标题浅谈let、const、var的区别
在ES6中,添加了let、const两个JavaScript关键字。
特点是:
let关键字声明的变量只能在let命令的代码块中生效。
const关键字声明的只是一个只读常量,一旦声明之后,常量的值就不能修改。
全局变量
在函数体外声明的变量是全局变量,全局变量在任何地方都可以访问,它的作用域是全局的。
局部变量
在函数体内声明的变量是局部变量,局部变量只能在函数内部访问,它的作用域是局部的。
块级作用域
在ES6之前没有块级作用域的概念,在引进let、const关键字之后可以使用块级作用域。
var声明的变量没有块级作用域的特性,在{}外依然可以访问。
而let、const声明的变量具有块级作用域的特性,声明的变量只能在{}内有效,在外部访问不了。
1|{
2|var x=2;
3| } //在外部可以访问和使用x变量
4|
5|{
6|let y=3;
7| } //在外部不可访问和使用y变量
problem:在重新定义变量时候,使用var声明变量,在外部再声明就会覆盖函数内部的值,而let关键字正好解决这个问题,只能在let声明的代码块中有效。
注: 循环体作用域也是有这样的反映。
HTML代码中的全局变量
在JS中,声明的全局变量是属于JS环境的。
在HTML中的声明的全局变量是全局作用域是window对象。
1、使用var关键字的声明的全局作用域变量的属于window对象。
2、使用let关键字声明的全局作用域变量的不属于window对象。
重置变量
使用var关键字的声明的变量可以在任何地方修改。
在相同的作用域或块级作用域,不能使用let关键字来重置var关键字声明的变量。
1|var x=2; //合法
2|let x=3; //不合法
3|{
4|var x=2; //合法
5|let x=3; //不合法
6| }
在相同作用域或块级作用域,不能使用let关键字来重置let关键字声明的变量。
1|let x=2; //合法
2|let x=3; //不合法
3|{
4|let x=4; //合法
5|let x=5; ///不合法
6|}
在相同作用域或块级作用域,不能使用var关键字来重置let关键字声明的变量。
1|let x=2; //合法
2|var x=3; //不合法
3|{
4|let x=4; //合法
5|var x=5; ///不合法
6|}
let在不同作用域或不同块级作用域,可以重新赋值声明。
1|let x=2; //合法
2|{
3|let x=4; //合法
4|}
变量提升
var 关键字在JS中,可以先使用后声明。
let 关键字在JS中,必须先声明后使用。
const关键字
const关键字可以声明一个或多个常量,在声明时必须进行初始化,初始化之后的值不能修改。
1|const PI = 3.141592653589793;
2|PI = 3.14; // 报错
3|PI = PI + 10; // 报错
const关键字定义常量和let关键字定义的变量
- 两者都是块级作用域
- 两者都不能和它所在的相同作用域的其他变量或者函数拥有相同的名称。
- 同时,const定义完常量就不能再修改,而let定义的变量可以。
- const的定义常量时必须初始化,而let定义变量是不需要。
const定义的并非真正的常量
const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。但是我们不能对常量对象重新赋值。
const重置变量
在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var 和 let关键字声明的变量:
1|var x = 2; // 合法
2|const x = 2; // 不合法
3|{
4| let x = 2; // 合法
5| const x = 2; // 不合法
6|}
在相同的作用域或块级作用域中,不能使用 const 关键字来重置 const 关键字声明的变量:
1|const x = 2; // 合法
2|const x = 3; // 不合法
3|x = 3; // 不合法
4|var x = 3; // 不合法
5|let x = 3; // 不合法
6|
7|{
8| const x = 2; // 合法
9| const x = 3; // 不合法
10| x = 3; // 不合法
11| var x = 3; // 不合法
12| let x = 3; // 不合法
13|}
const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:
1|const x = 2; // 合法
2|
3|{
4| const x = 3; // 合法
5|}
变量提升
const 关键字定义的变量则不可以在使用后声明,也就是变量需要先声明再使用。
总结
使用var关键字声明的全局作用域变量属于window对象。
使用let关键字声明的全局作用域变量不属于window对象。
使用var关键字声明的变量在任何地方都可以修改。
在相同的作用域或块级作用域中,不能使用let关键字来重置var关键字声明的变量。
在相同的作用域或块级作用域中,不能使用let关键字来重置let关键字声明的变量。
let关键字在不同作用域,或不用块级作用域中是可以重新声明赋值的。
在相同的作用域或块级作用域中,不能使用const关键字来重置var和let关键字声明的变量。
在相同的作用域或块级作用域中,不能使用const关键字来重置const关键字声明的变量
const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:
var关键字定义的变量可以先使用后声明。
let关键字定义的变量需要先声明再使用。
const关键字定义的常量,声明时必须进行初始化,且初始化后不可再修改。