JavaScript 变量声明:let 与 const

862 阅读2分钟

变量的三种声明方式

var a = 1;
let a = 1;   //变量声明
const a = 1; //常量声明
a = 1;

区别:

  • var 是过时的,不好用的方式
  • let 是新的,更合理的方式
  • const 是声明时必须赋值,且不能再改的方式
  • 最后的这种方式是错误的,不要这样声明

变量声明在指定值的同时,也指定了类型,但是值和类型都可以随意变化。

let a = 1;
a = 'hello';

var 声明

  1. 没有块级作用域
  2. 可以重复声明
  3. 有变量提升
  4. 全局声明的 var 变量,会变成 window 属性

let 声明

1. 遵循块级作用域,即使用范围不能超出 {}

{
  let a = 10;
  var b = 1;   // var 声明的变量没有块级作用域
}
a; // ReferenceError: a is not defined.
b; // 1

2. 在同一个函数或块作用域中不能重复声明

function fn() {
  let a = 1
  let a = 2  //SyntaxError thrown.
}

3. 可以赋值,也可以不赋值

4. 必须先声明再使用,否则报错

{
  console.log(b)
  let b = 1
}  //ReferenceError

5. 全局声明的 let 变量,不会变成 window 的属性

let abc = 'abc';
window.abc;  //undefined

var abc = 'abc';  // var 声明的全局变量会变成 window 的属性
window.abc;  //"abc"

6. for 循环配合 let 有奇效

for (var i = 0; i < 5; i++) {
  setTimeout(() => { console.log(i) }, 0)
}  //输出5个5

上面代码中,结果会输出5个5,由于 setTimeout 是异步执行的,所以 for 循环执行结束后(此时 i = 5)再执行 setTimeout,且执行五次。

把 var 改为 let 能让上面的例子打印出0,1,2,3,4。

for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i)
  }, 0)
}

上面代码中,变量ilet声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。

const 声明

  • 规则和 let 几乎一致
  • 只有一条不一样:声明时就要赋值,赋值后不能改
const i = 100;
i = 101;  //TypeError: Assignment to constant variable.

name 和 'name' 的区别

name 是变量,值可变,可能是'name',也可能是'hello'

let name = 1
name = 2  //2
name = 'hello'  //"hello"

'name' 是字符串常量,常量就是不变量,'name' 只能是 'name', 不能是其他值。

相关学习链接

网道 ES6 教程

推荐阅读:《我用了两个月的时间才理解 let》