1. 作用域
var
: 具有函数作用域或全局作用域。这意味着在一个函数内部声明的变量在整个函数内部都是可见的,而在函数外部声明的变量在整个脚本或全局范围内可见。let
和const
: 具有块级作用域。这意味着变量仅在其声明的代码块内(如if语句或循环)可见。
2. 变量提升 (Hoisting)
var
: 变量声明会被提升到作用域的顶部,但初始化不会。这意味着你可以在声明之前引用变量,但它会被初始化为undefined
。let
和const
: 没有变量提升。你不能在声明之前引用这些变量,否则会导致一个ReferenceError。在声明之前引用变量的区域被称为“暂时性死区”(Temporal Dead Zone, TDZ)。
3. 重复声明
var
: 允许在同一个作用域内重复声明相同的变量名,后面声明会覆盖之前的声明。let
和const
: 不允许在同一作用域内重复声明相同的变量名。
4. 变量的可变性
var
和let
: 宣告的变量值是可以改变的。const
: 声明的变量值是常量,一旦赋值就不能再次被赋值。但是,如果const
变量指向的对象或数组,其内容可以修改,只是不能重新指向另一个值。
5. 全局对象属性
var
: 在全局作用域下声明的var
变量会自动成为全局对象(如window
在浏览器环境)的属性。let
和const
: 在全局作用域下声明,不会成为全局对象的属性。
6. 标准版本
var
: 存在于ES 3及更高版本。let
和const
: 引入于ES6。