let const的区别

64 阅读2分钟

let,const,var这三个命令均是用来声明变量。

let

  • let声明的变量,只在let所在的代码块有效。
 {
  let a = 10;
  var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
  • let命令不存在变量提升
    "变量提升"是指:变量可以在声明之前使用,var会存在变量提升现象,值为undefined;而let要先声明再使用,否则会报错。
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
  • let不允许重复声明
    let不允许在相同作用域内,重复声明一个变量。
// 报错
function func() {
  let a = 10;
  var a = 1;
}
// 报错
function func() {
  let a = 10;
  let a = 1;
}

const

const的语法与let基本相似,有以下几点区别于let命令

  • const声明一个只读常量,一旦声明,常量的值就不可改变。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
  • const声明的变量必须立即初始化,只声明而不赋值,会报错
 const foo;
// SyntaxError: Missing initializer in const declaration
  • const的本质
    const实际上保证的,并不是变量的值不得改动,而是变量指向的内存地址所保存的数据不能改动。对于简单的数据类型(数值,字符串、布尔值),值就是保存在变量指向的那个内存地址,因此等同于常量;对于复合类型的数据(对象、数组),变量指向的是内存地址,所以,const只能保证这个指针是固定的(即总是指向另一个固定的地址)。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only  

上面代码中,常量foo存储的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,,但是对象本身是可变的,还能够继续添加新属性。

参考: www.bookstack.cn/read/es6-3r…