几天给大家总结了一下var、let、const的区别以及优缺点,也给初入前端大家庭的朋友详细讲解的关于变量之间的区别,如果有问题的还请各位指点,
var
在ES5中,顶层对象的属性和全局变量的属性是等价的,用var声明的变量是全局变量也是顶层变量。
顶层对象在浏览器环境指的是window对象。
var num = 10
console.log(window.num); //控制台打印 10
使用var声明存在变量提升的情况。比如看下面一段代码
console.log(num); //控制台打印 undefined
var num = 10
但实际情况var并不是这样执行的,因为var存在变量提升,所以是声明了变量没有给值此时会打印undefined。如果上方等同的代码在let和const上执行不会出现以下的变量提升的只会报错。
var num
console.log(num); //控制台打印 undefined
num = 10
使用var我们可以对一个变量多次进行声明,后面声明的变量会覆盖前面声明的变量
var num = 10
var num = 20
console.log(num); //控制台打印 20
若在函数内部使用var声明的话,它就是局部变量。
var num = 20
function Fn() {
var num = 30
}
Fn()
console.log(num) //控制台打印 20
若不在函数中使用var,那么他就是全局变量
var num = 20
function Fn() {
num = 30
}
Fn()
console.log(num) //控制台打印 30
let
ES6新语法,其实和var差不多的一个情况,在var上优化一部分功能使程序员用起来更加的方便。
它的用法和var很相似,但是又有很多不同,比如:
一、 所声明的变量,只在let命令所在的代码块内有效
比如在函数内声明就只能在函数内使用
二、 没有变量提升
console.log(num) // 报错
let num = 2
此时变量num还未声明就调用它,只会报错,没有变量提升
三、 不允许重复声明
let num = 20
let num = 30 //打印报错 Uncaught SyntaxError: Identifier 'num' has already been declared
不允许重复对一个变量在相同作用域重复声明,若需要修改只能按一下列所示代码执行
let num = 10
num = 20
console.log(num); //控制台打印20
后面的num会覆盖前面的num,注意是相同作用域的情况下是不能重复声明的,但是在不同作用域就可以重复声明,互不影响。如下列代码
let num = 25
{
let num = 40
}
这种情况下是不会报错的。
const
const和let又是极其相似,const的最大特点就是,它是一个常量,一旦声明变量之后,就不允许修改它的值否则就会报错
const num = 10
num = 30
const一旦声明变量,就要立即初始化,不可往后再赋值,否则就会报错
const a; //声明要立即初始化 不然就会报错
如果一个变量,之前在var或let上被声明过,那么不能再用const重复声明,否则就会报错。
var num = 100
let Tnum = 100
const num = 200
const Tnum = 200
// 都会报错
const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动 对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量 对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变
const obj = {};
// 为 obj 添加一个属性,可以成功
obj.prop = 123;
obj.prop // 123
// 将 foo 指向另一个对象,就会报错
obj = {}; //报错
const最主要的就是变量的值不能改动,其他功能和let几乎一致。
区别
var、let、const区别总结
- 变量提升
- 暂时性死区
- 块级作用域
- 重复声明
- 修改声明的变量
变量提升
var有变量提升,可以在变量声明之前调用它,但是值为undefined。
console.log(num); //控制台打印 undefined
var num = 10
let和const没有变量提升,不能再变量声明之前调用它,一旦调用就会报错
console.log(num1); //报错
let num1 = 10
console.log(num2); //报错
const num2 = 10
暂时性死区
var没有暂时性死区这种情况。因为可以在变量声明之前调用它。
let和const有暂时性死区,因为let和const只有声明之后才能获取和使用它,只要不是先声明后调用就会报错
console.log(num1); //报错
let num1 = 10
console.log(num2); //报错
const num2 = 10
块级作用域
var 没有块级作用域
{
var num = 20
}
console.log(num) //控制台打印 20
let 和 const 有块级作用域
{
let num = 20
}
console.log(num) // 报错
{
const num1 = 20
}
console.log(num1) // 报错
重复声明
var允许重复声明,
var num = 10
var num = 20
console.log(num); //控制台打印 20
let和const不允许重复声明。
let num = 20
let num = 30 //报错
const c = 10
const c = 20 //报错
修改声明的变量
var和let可以修改。
var num = 20
num = 30
console.log(num) //打印30
let num = 20
num = 30
console.log(num) //打印30
const不能修改,它只是一个可读的常量,一旦声明了就不允许修改。
const num = 20
num = 30
console.log(num) //报错
关于var、let、const区别差不多到这里就结束了,现在在开发中推荐的还是使用const和let,尽量的使用const,其他大多数情况下使用let,尽量避免使用var。