let 和 const 命令:基础用法、特点。
变量的解构赋值:数组、对象、字符串、函数参数的解构赋值。
1、初识ES6
ECMAScript 6.0 (以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
2、let 和 const 命令
ES6 新增了
let命令,用来声明变量,用法类似与var,但let命令声明的变量只在所在代码块内有效。
1 | { |
const声明一个只读的常量。一旦声明,常量的值就不能改变。因此const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合数据类型,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
1 | const PI = 3.1415; |
特点:
不存在变量提升:
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。let和const命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。1
2
3
4
5console.log(age); // undefined
var age = 18;
console.log(name); // 报错ReferenceError
let name = 18;暂时性死区
只要块级作用域内存在
let命令,它所声明的变量就“绑定”这个区域,不受外部影响。如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。1
2
3
4
5var temp = 123;
if(true){
temp = 456; // ReferenceError
let temp;
}不允许重复声明
let和const不允许在相同作用域内,重复声明同一个变量。1
2
3
4
5
6// 报错 Identifier 'a' has already been declared
var a = 0;
let a = 1;
// 报错 Identifier 'a' has already been declared
let a = 10;
let a = 10;
作用域
ES5
ES5 只有全局作用域和函数作用域,没有块级作用域。
1
2
3
4
5
6
7
8
9
10
11
12
13var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined,变量提升,内层tmp覆盖外层tmp
for(var i = 0 ;i < 5;i++){
console.log(i);
}
console.log(i); // 5,循环变量泄露为全局变量ES6 的块级作用域
let实际上为 JavaScript 新增了块级作用域。1
2
3
4
5
6
7function fun(){
let n = 10;
if(true){
let n = 20;
}
console.log(n); // 10
}
3、变量的解构赋值
数组的解构赋值
1 | // ES5: |
对象的解构赋值
1 | // 数组的元素是按次序排列的,变量的取值由它的位置决定; |
字符串的解构赋值
1 | // 字符串也可以解构赋值。转换成了一个类似数组的对象。 |
函数参数的解构赋值
1 | function getData(){ |