ES6 let和const命令

1.1 let和const

1.1.1 let基本用法

用法相似var,表示常量,只在let命令所在代码块内有效。es6

1.1.2 const基本用法

const声明只读常量。一旦声明常量的志不能变。一旦声明,必须当即赋初始值,不能留到之后赋值。bash

const foo = {};

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

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

本质:const实际上保证的,并非变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

1.2.3 let和const共同点

1.不存在变量提高

变量提高:var命令会发生“变量提高”现象,即变量能够在声明以前使用,值为undefined函数

// var 的状况
console.log(foo); // 输出undefined
var foo = 2;

// let或const 的状况
console.log(bar1); // 报错ReferenceError
console.log(bar2)
let bar1 = 2;
const bar2 = 3;
复制代码

2.暂时性死区

只要块级做用域内,存在let或const命令,它所声明的变量就绑定这个区域,再也不受外部的影响。ui

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
复制代码

在代码块内,使用let或const命令声明变量以前,该变量都是不可用的。这在语法上,称为“暂时性死区”。spa

ES6 规定暂时性死区和let、const语句不出现变量提高,主要是为了减小运行时错误,防止在变量声明前就使用这个变量,从而致使意料以外的行为。code

3.不容许重复声明

let和const不容许在相同做用域内重复声明一个变量。对象

// 报错
function func() {
  let a = 10;
  var a = 1;
}

// 报错
function func() {
  var a = 10;
  let a = 1;
}

// 报错
function func(){
    let a = 10;
    let a = 1;
}

// 不报错
function func(){
    var a = 10;
    var a = 1;
}
复制代码

1.2块级做用域

好处

1.外层代码块不受内层代码块影响,外层做用域没法读取内层做用域的变量,内层做用域能够定义外层做用域的同名变量而不受影响。内存

// ES6
function foo(){
    let a = 0;
    if(true){
        let a = 1;
    }
    console.log(a); // 0
}

// ES5
function foo(){
    var a = 0;
    if(true){
        var a = 1;
    }
    console.log(a); // 1
}
复制代码

2.循环变量不会泄漏为全局变量作用域

// ES6
let s = 'hello';
for(let i = 0;i<s.length;i++){
  console.log(s[i]);
}
console.log(i); // 报错, i is not defined

// ES5
var s = 'hello';
for(var i = 0;i<s.length;i++){
  console.log(s[i]);
}
console.log(i); // 5
复制代码

3.函数执行更简洁get

// ES6
{
    ...;
}

// 匿名当即执行函数表达式
(function(){
    ...;
}());
复制代码

1.3ES6六种声明变量的方法

  • var(ES5)
  • function(ES5)
  • let(ES6)
  • const(ES6)
  • import(ES6)
  • class(ES6)

摘自阮一峰

相关文章
相关标签/搜索