该博文参考ECMAScript6 入门,总结为自己的笔记以便查阅。
let 和 const 命令
1. let命令
基本用法:
let的用法类似与var, 但是let声明的变量只在它所在的代码块有效。
例如for循环中的自增变量,如果使用var来声明,那它就是全局的, 全局只有一个变量i,每一次循环, 变量i的值都会发生改变。但如果是使用let声明, 则i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,js引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
此外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined,let命令改变了这种语法行为, 它所声明的变量一定要在声明后使用,否则会报错。
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部影响。
不允许重复声明
let不允许在相同作用域内,重复声明一个变量。
块级作用域
var只有全局作用域和函数作用域。没有块级作用域,这样造成的弊端:
- 内层变量可能会覆盖外层变量。
- 用来计数的循环变量泄漏为全局变量。
const
const 声明一个只读常量,一旦声明,常量的值就不能改变。声明的同时必须立即初始化,不能留到以后赋值。否则会报错。
ES6声明变量的6种方法
- var
- function
- let
- const
- import
- class
变量的结构赋值
1. 数据的解构赋值
基本用法
let a = 1;
let b = 2;
let c = 3;
let [a, b, c] = [1, 2, 3];
解构不成功,变量的值就等于undefined。
不完全解构,解构可以成功。
默认值
解构赋值允许制定默认值
let [x, foo = true] = ['a'] //x='a', foo=true
2. 对象的解构赋值
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
3.字符串的解构赋值
字符串也可以解构赋值。
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
let {length: len} = 'hello';
len //5
用途
交换变量的值
let x = 1;
let y = 2;
[x, y] = [y, x];