ES6(一):let和const、块级作用域、解构赋值

推荐学习 ECMAScript 6 入门 | 作者:阮一峰
地址:https://es6.ruanyifeng.com/

1. let命令

1.1 基本用法

ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
for循环的计数器,就很合适使用let命令。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

如果使用let,声明的变量仅在块级作用域内有效,最后输出的是 6

1.2 不存在变量提升

var命令会发生“变量提升”现象,即变量可以在声明之前使用
let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

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

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

1.3 不允许重复声明

let不允许在相同作用域内,重复声明同一个变量

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

不能在函数内部重新声明参数

function func(arg) {
  let arg;
}
func() // 报错

2. const

2.1 基本用法

const声明一个只读的常量。一旦声明,常量的值就不能改变
一旦声明变量,就必须立即初始化,不能留到以后赋值,也与let一样不可重复声明。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

const的作用域与let命令相同:只在声明所在的块级作用域内有效.

if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined

2.2 本质

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

const foo = {};

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

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

3.块级作用域

  • var 声明的变量是函数级别作用域,且存在变量提升,因此在解决闭包问题需要使用匿名函数包裹
  • let/const 声明的变量是块级作用域{},不存在变量提升,只在let命令所在的代码块内有效。比如在for循环中解决闭包问题

因此可以使用let和const完全取代var

4.解构赋值

4.1数组解构赋值

ES5写法

let a = 1;
let b = 2;
let c = 3;

ES6写法

let [a, b, c] = [1, 2, 3];

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

4.2对象解构赋值

let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

4.3用途

(1)交换变量的值
let x = 1;
let y = 2;

[x, y] = [y, x];
(2)从函数返回多个值
// 返回一个数组
function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();

// 返回一个对象
function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();
(3)函数参数的定义
// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});
(4)提取 JSON 数据
let jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

let { id, status, data: number } = jsonData;

console.log(id, status, number);
// 42, "OK", [867, 5309]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值