一、var声明变量的特点

(1)变量提升:使用var声明变量会自动提升到函数作用域的顶部。

java const声明常量 const声明变量_作用域

(2)var声明的范围是函数作用域

(3)var在全局作用域中声明的变量会成为window对象的属性

java const声明常量 const声明变量_java const声明常量_02

二、let声明变量的特点

(1)let声明的范围是块级作用域。

(2)暂时性死区,let声明的变量不会在作用域中被提升。
let声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出ReferenceError。

(3)let在全局作用域中声明的变量不会成为window对象的属性。

java const声明常量 const声明变量_块级作用域_03

三、const声明变量的特点

(1)const的行为与let基本相同,唯一重要的区别是const声明变量时必须同时初始化变量,且尝试修改const声明变量会导致运行时错误。

java const声明常量 const声明变量_java const声明常量_04

(Assignment to constant variable)意思是常数变量赋值

注意:const声明的限制只适用于它指向的变量的引用,即如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

java const声明常量 const声明变量_java const声明常量_05

四、区别

(1).变量提升

  • var声明的变量存在变量提升,即变量可以在声明前调用,值为undefined
  • let和const不存在变量提升,即他们所声明的变量一定要在声明后使用,否则报错。

(2).暂时性死区

  • var不存在暂时性死区
  • let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错

(3).块级作用域

  • var不存在块级作用域
  • let和const存在块级作用域

(4).重复声明

  • var允许重复声明
  • let和const在同一作用域不允许重复声明变量

(5).修改声明的变量

  • var和let可以
  • const声明一个只读的常量。一旦声明,常量的值就不能被改。

五、使用

  • 能用const的时候尽量使用const,其他情况下大多数使用let,尽量避免使用var。