let 和 const命令

一. let命令

(1)不存在「变量提升」
var命令存在「变量提升」。

console.log(a);  //  undefined
var a = 1;

上面代码等价于

var a;
console.log(a);  //  undefined
a = 1;

如果使用let

console.log(a);  //  a is not defined
let a = 1;

(2)暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

总结:「就是在块级作用域内,使用let命令声明变量前,该变量不可使用」。

二. const命令

「const」命令声明一个只读的常量。

本质:
「const」实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于「简单数据类型」(Number,String,Boolean),值就保存在变量指向的那个内存地址,因此等同于常量。
而对于「复杂数据类型」(主要是指数组和对象),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。

比如:

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

参考:http://es6.ruanyifeng.com/#docs/let

你可能感兴趣的:(let 和 const命令)