对象解构
必须用圆括号包裹解构赋值语句,这是因为暴露的花括号会被解析为代码块语
句,而块语句不允许在赋值操作符(即等号)左侧出现。圆括号标示了内部的花括号并不是
块语句、而应该被解释为表达式,从而完成赋值操作。
1 | let node = { |
顺序不同也没事
也可以结合冒号和等号一起使用
1 | let {width: w = 100, height: h = 200, title} = options; |
实际上是这样 let { foo: foo, bar: bar } = { foo: “aaa”, bar: “bbb” };
对 type 与 name 的赋值正常进行,同时 node 也被传入
了 outputInfo() 函数
1 | let node = { |
赋值给非同名本地变量
1 | let node = { |
嵌套的对象解构
1 | let node = { |
每当有一个冒号在解构模式中出现,就意味着冒号之前
的标识符代表需要检查的位置,而冒号右侧则是赋值的目标。当冒号右侧存在花括号时,表
示目标被嵌套在对象的更深层次中。
数组解构
数组解构的语法看起来与对象解构非常相似,只是将对象字面量替换成了数组字面量。数组
解构时,解构作用在数组内部的位置上,而不是作用在对象的属性名上
1 | let colors = [ "red", "green", "blue" ]; |
在 ES6 中互换值
1 | let a = 1, |
引用
1 | let a = 1, |
数组嵌套解构
1 | let colors = ['red', 'yellow', ['green', 'lightgreen'], 'blue']; |
参数解构
原先
1 | // options 上的属性表示附加参数 |
now
1 | function setCookie(name, value, { secure, path, domain, expires }) { |
执行时不能缺少option参数
1 | function setCookie(name, value, options) { |
参数解构的默认值
1 | function setCookie(name, value, |
上面的参数解构只有一个缺点,也就是当传入参数值为 null 时会引发程序异常。只有
null 与 undefined 是无法被解构的,而传入 undefined 会触发默认参数的使用条
件,从而避免了异常;但传入 null 就不会有这么幸运了,它既不会触发默认参数,也
不能被解构,从而导致异常。
默认值可以是更加复杂的表达式甚至可以是函数调用,这些表达式或函数只会在这个变量未被赋值的时候才会被计算。
1 | // 默认值 |
练习
1 | 以下是一个 salaries 对象: |
answer1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 let salaries = {
"John": 100,
"Pete": 300,
"Mary": 250
};
// topSalary(salaries)
function topSalary(salaries) {
const orderList = Object.entries(salaries).sort((a, b) => {
return b[1] - a[1]; //通过值降序排序
})
return orderList[0]
}
let money = topSalary(salaries);
console.log(money);
answer2
1 | function topSalary(salaries) { |
补充
1 | let [x, y, ...z] = ['a']; |
1 | let [x, y = 'b'] = ['a', undefined]; // x='a', y='b' |
注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
1 | let {toString: s} = 123; |
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。