let与const

130 阅读2分钟

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阶段。未来支持情况未知~-~。

image.png