ES6 let和const命令

187 阅读2分钟

1. 是否存在变量提升

var 存在变量提升,let与const不存在变量提升。

console.log(foo);    // undefined
var foo = 2;

console.log(bar);    // 报错
let bar = 2;

// const 同理

const 声明的是一个只读的常量。一旦声明,常量的值就不能改变。

const 实质上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值)值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(对象、数组)变量指向的是内存地址,保存的值只是一个实际数据的指针。const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是否可变,就完全不能控制了。

2. 是否允许重复声明

var 允许重复声明, let与const不允许重复声明

var a = 1;
var a = 3;

let a = 1;
let a = 3;    // 报错

constlet

3. 是否存在块级作用域

var 不存在块级作用域(只有函数作用域和全局作用域) let 与const 存在块级作用域

if (true) {
  var test = true; // 使用 "var" 而不是 "let"
}

alert(test); // true
if (true) {
  let test = true; // 使用 "let"
}

alert(test); // Error: test is not defined

对于循环也是这样的,var 声明的变量没有块级作用域也没有循环局部作用域

for (var i = 0; i < 10; i++) {
  var one = 1;
  // ...
}

alert(i);   // 10,"i" 在循环结束后仍可见,它是一个全局变量
alert(one); // 1,"one" 在循环结束后仍可见,它是一个全局变量

如果一个代码位于函数内部,那么var 声明的变量作用域将为函数作用域

function sayHi() {
    if(true) {
        var phrase = 'hello';
    }
    alert(phrase)    // hello
}
sayHi();
alert(phrase)    // phrase is not defined