let命令
声明的变量只在所在的代码块内有效
建议在for循环的计数器中使用
const命令
声明的常量不可改变,一旦声明,必须立即初始化
- 本质: 不可改变的本质是变量指向的内存地址不能改变,基本类型(数值、字符串、布尔)的值保存在变量指向的内存地址中,而引用类型(对象或数据等),变量指向的内存地址只是一个指针,const只能保证指针不变,不能保证指针指向的数据结构是否变了。
声明的变量只在所在的代码块内有效
解决了什么
块级作用域
- ES5只有全局作用域和函数作用域,没有块级作用域,会出现以下的问题:
1、内层变量可能覆盖外层变量;
2、用来计数的循环变量泄露为全局变量
- ES6的块级作用域-let和const
变量提升
- 变量可以在声明之前使用,值为undefined
- 用var声明的变量会发生”变量提升“的现象
带了什么
暂时性死区
- let和const声明的变量
不允许重复声明
- 不允许在相同作用域内重复声明同一个变量。
// 报错
function () {
let a = 10;
var a = 1; // 或 let a = 1;
}
- 不能在函数内部重新声明参数。
function func(arg) {
let arg; // 报错
}
题外: do 表达式
块级作用域是一个语句,将多个操作封装在一起,没有返回值。但是,在块级作用域以外,无法获取返回值。
目前有一个新提案: do{...},就是是在块级作用域之前加上 do,使它变为 do 表达式。
// 变量 x 会得到整个块级作用域的返回值。
let x = do {
let t = 3;
t * t + 1;
// 返回 t * t + 1的值
};
可以使用条件表达式
let x = do {
if (foo()) { f() }
else if (bar()) { g() }
else { h() }
};
也支持JSX嵌套写法
return (
<nav>
<Home />
{
do {
if (loggedIn) {
<LogoutButton />
} else {
<LoginButton />
}
}
}
</nav>
)
允许表达式为空,等价于void 0
do {} // void 0
支持情况
该提案处于TC39流程的第1阶段。未来支持情况未知~-~。