banner
banner
banner
NEWS LETTER

ES6-解构赋值

Scroll down

从数组和对象中提取值,对变量进行赋值

数组(一 一 对 应)

完全解构(必须一一对应):

1
2
3
4
5
6
7
8
9
10
11
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

// 如果想赋后面的值的,且前面不赋值,则可以用','替代前面的参数,多少个参数多少个','
// 解构不成功的变量,值为undefined

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

不完全解构(即等号左边的模式,只匹配一部分的等号左边的数组):

1
2
3
4
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4

默认值

  • 数组/对象成员严格等于undefined,默认值才会生效。
  • 数组/对象成员是null,默认值就不会生效
    1
    2
    3
    4
    5
    6
    7
    8
    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

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
// 解构失败,返回undefined

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

// console.log赋值到log变量
const { log } = console;
log('hello') // hello

// 变量名与属性名不一致(真正被赋值的是后者,而不是前者。)
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined

嵌套

1
2
3
4
5
6
7
8
9
10
11
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};

let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]

注意点

1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。

    // 错误的写法                // 正确的写法
    let x;                      let x;
    {x} = {x: 1};               ({x} = {x: 1});

2)解构赋值允许等号左边的模式之中,不放置任何变量名

  • 示例:({} = [true, false]);

3)数组本质是特殊的对象,因此对数组进行对象属性的解构。

1
2
3
4
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3

4)不要使用圆括号

字符串(被转换成了一个类数组的对象)

1
2
3
// 类似数组中length属性
let {length : len} = 'hello';
len // 5

数值、布尔值(等号右边不管是什么,会先转为对象)

1
2
3
4
5
6
7
let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true

// undefined和null无法转为对象,会报错

函数参数

  • 遍历时数组存在undefined,则会被默认值替代
    1
    2
    [1, undefined, 3].map((x = 'yes') => x);
    // [ 1, 'yes', 3 ]
其他文章
cover
ES6-数值的拓展
  • 24/10/31
  • 15:54
  • ES6
cover
ES6-函数的拓展
  • 24/10/31
  • 15:54
  • ES6
目录导航 置顶
  1. 1. 数组(一 一 对 应)
    1. 1.1. 完全解构(必须一一对应):
    2. 1.2. 不完全解构(即等号左边的模式,只匹配一部分的等号左边的数组):
  2. 2. 默认值
  3. 3. 对象
  4. 4. 嵌套
  5. 5. 注意点
  6. 6. 字符串(被转换成了一个类数组的对象)
  7. 7. 数值、布尔值(等号右边不管是什么,会先转为对象)
  8. 8. 函数参数
请输入关键词进行搜索