总结于《JavaScript高级程序设计(第四版)》
var | let | const | |
声明范围 | 声明的范围是函数作用域 | 声明的范围是块作用域 | 声明的范围是块作用域 |
初始化 | 声明变量时不必须同时初始化变量 可以同时初始化多个不同数据类型的变量,用逗号分隔 | 声明变量时不必须同时初始化变量 可以同时初始化多个不同数据类型的变量,用逗号分隔 | 声明变量时必须同时初始化变量 可以同时初始化多个不同数据类型的变量,用逗号分隔 |
冗余声明 | 允许冗余声明 | 不允许同一个块作用域中出现冗余声明(冗余声明包含var也不行) 为了避免SyntaxError, 必须确保页面不会用let重复声明同一个变量 | 不允许同一个块作用域中出现冗余声明(冗余声明包含var也不行) 为了避免SyntaxError, 必须确保页面不会用let重复声明同一个变量 |
修改变量 | 定义的变量可以改变保存的值,也可以改变值的类型, | 定义的变量可以改变保存的值,也可以改变值的类型, | 修改const声明的变量会导致运行时错误 |
变量提升 | 声明的变量可以在作用域中被提升 | 声明的变量不会在作用域中被提升 | 声明的变量不会在作用域中被提升 |
windows对象属性 | 全局作用域中声明的变量可以成为windows对象的属性 | let在全局作用域中声明的变量不会成为windows对象的属性 | let在全局作用域中声明的变量不会成为windows对象的属性 |
for循环变量渗透 | for循环中使用var声明的变量会渗透到循环体的外部 | for循环中使用let声明的变量不会渗透到循环体的外部 | const不能声明迭代变量,因为迭代变量会自增 |
迭代变量 | 使用var声明迭代变量时,如果执行超时逻辑所有输出的变量将为同一个值,即最终值 | 使用let声明迭代变量时,JS会为每个迭代循环声明一个新的迭代变量。 | const不能声明迭代变量,因为迭代变量会自增 |