阮一峰es6第三章学习笔记-变量的解构赋值

2019-03-09  本文已影响0人  文仔CXKSNLXX

数组的解构赋值

基本用法

上面的foo都会变成undefined

默认值

-解构赋值允许指定默认值,但要注意一点,只有当右边的数组成员严格等于”undefined“的时候,默认值才会生效
- 默认值生效的例子
```
let [foo = true] = [];
foo // true

let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
```
- 默认值不生效的例子
```
    let [x = 1] = [undefined];
x // 1

let [x = 1] = [null];
x // null
```
备注:null === undefined 返回的是false,所以null不算是严格等于undefined,因此默认值不能生效
- 当默认值是一个表达式的时候,只有在用到的时候才会求值,这钟叫`惰性求值`
```
    function f() {
  console.log('aaa');
}

let [x = f()] = [1];
```
根据我们上面所说的,x是等于1,因为1不是严格等于undefined,因此默认值不生效。
- 在默认值中,你可以引用解构赋值的其他变量,但这个变量必须在引用之前(意思是该变量必须已经声明),否则报错
```
    let [x = 1, y = x] = [];     // x=1; y=1
let [x = 1, y = x] = [2];    // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = [];     // ReferenceError: y is not defined
```

对象的解构赋值

对象解构中的默认值

字符串的解构赋值

数值和布尔值的解构赋值

函数参数的解构赋值

圆括号问题

不能使用圆括号的情况

// 全部报错
({ p: a }) = { p: 42 };
([a]) = [5];
// 报错
[({ p: a }), { x: c }] = [{}, {}];

可以使用圆括号的情况

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

解构赋值的用途

交换变量的值

let x = 1;
let y = 2;

[x, y] = [y, x];

优点:简洁,易读,语义清晰

从函数返回多个值

可以十分方便的从多个返回值中取值

// 返回一个数组

function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();

// 返回一个对象

function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();

函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);

// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

提取JSON数据

解构赋值对提取 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]

函数参数的默认值

jQuery.ajax = function (url, {
  async = true,
  beforeSend = function () {},
  cache = true,
  complete = function () {},
  crossDomain = false,
  global = true,
  // ... more config
} = {}) {
  // ... do stuff
};

遍历Map结构

获取键名和键值

const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
// first is hello
// second is world

如果只想获取键名,或者只想获取键值,可以写成下面这样。

// 获取键名
for (let [key] of map) {
  // ...
}

// 获取键值
for (let [,value] of map) {
  // ...
}

输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map");

参考资料

阮一峰es6教程

上一篇下一篇

猜你喜欢

热点阅读