var、let、const的区别
前言
在 JS 中,var、let、const 都是用于声明变量的关键词,var 最为常用。
- var 是 ES6 之前用来声明变量的关键词
- let 和 const 是 ECMAScript 6(简称 ES6 ) 后新增的关键字
- let 是用于替代 var 来声明变量
区别
一、指针指向
let 创建的变量是可以更改指针指向(可以重新赋值)。但 const 声明的变量是不允许改变指针的指向。因此,const 关键词常用来声明常量,一经声明后就无法再次赋值,否则会报错。使用 const 声明常量,一旦声明,就必须立即初始化
注意:
const 声明常量,允许在不重新赋值的情况下修改它的值(基本数据类型不可,只有引用数据类型可以,引用类型引用的是地址不是值)
//基本数据类型赋值为常量之后是不可修改的 const name='zhangsan'; name='nn'; //x //引用数据类型 const student={age:18}; //student={}; student.age=19;
二、重复声明
var 声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const 和 let 不允许重复声明变量。
三、初始值设置
在变量声明时,var 和 let 可以不用设置初始值。const 不允许只声明不赋值,一旦声明就必须赋值。
四、变量提升
var 存在变量提升,let 和 const 不存在变量提升,即在变量只能在声明之后使用,否在会报错。
五、块级作用域
块作用域由 { } 包括,let 和 const 具有块级作用域,var 不存在块级作用域。块级作用域解决了 ES5 中的两个问题:
- 内层变量可能覆盖外层变量
- 用来计数的循环变量泄露为全局变量
常见的作用域主要分为几个类型:全局作用域、函数作用域、块状作用域、动态作用域。
JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ES6 中新增了块级作用域,使用 let 声明的变量只能在块级作用域里访问,有“暂时性死区”的特性(也就是说声明前不可用)。、
- 块级作用域:大部分包含{}的都可以构成块级作用域,但是函数和对象不构成块级作用域(函数属于的是函数作用域而不是块级作用域,对象的话,又不能在里面let)
- 作用域链:内层作用域->外层作用域->…->全局作用域
六、window 对象的属性和方法
浏览器的全局对象是 window,Node 的全局对象是 global。全局作用域中,var 声明的变量,通过 function 声明的函数,会自动变为 window 对象的变量,属性或方法,但 const 和 let 不会。
七、暂时性死区
在使用 let、const 命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用 var 声明的变量不存在暂时性死区。
只要作用域内存在let、const,它们所声明的变量或常量就会自动“绑定”这个区域,不再受外部作用域的影响。
直白的说:暂时性死区就是在函数作用域内部声明的变量将会与对应的函数作用域进行绑定(当然没有的话还是会向上查找),当函数内部存在重复声明或者变量提示时,就算外面的作用域已经声明了这个变量,它的运行还是认准的该函数作用域中的声明情况