ES6 解构赋值

一:何为解构赋值
从数组、对象、字符串中提取值,对变量进行赋值,这种方法称之为“解构赋值”
二:解构赋值的分类
1. 数组的解构赋值
2. 对象的解构赋值
3. 字符串的解构赋值
4. 数值和布尔值的解构赋值
5. 函数参数的解构赋值
6. 圆括号问题
7. 用途
---------------------------------------------------------------------------------------------------
1 数组的解构赋值 [数组对应数组]
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
如果解构不成功,变量的值就等于 undefined
A 完全解构
let [a, b, c] = [1, 2, 3];
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1 bar // 2 baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1 y // 3 let [head, ...tail] = [1, 2, 3, 4];
head // 1 tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a" y // undefined z // []
B 不完全解构
let [x, y] = [1, 2, 3];
x // 1 y // 2
let [a, [b], d] = [1, [2, 3], 4];
a // 1 b // 2 d // 4
C 解构不成功
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
D 关于默认值
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
如果一个数组成员是 null,默认值就不会生效,因为 null 不严格等于 undefined。
let [x = 1] = [null]; x // null 如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
function f() {
return "我是函数的返回值";
}
let [x =f()] = ["我是新赋的值"];
console.log(x);
默认值可以引用解构赋值的其他变量,但该变量必须已经声明
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
2 对象的解构赋值
数组的元素是按 次序 排列的,变量的取值由它的 位置 决定;
对象的属性没有次序, 变量 必须与 属性 同名,才能取到正确的值。
let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa" baz // "undefined"
1.别名的引用:
let { foo:bar } = { foo: 'aaa', baz: 'bbb' };
对象的解构赋值的内部机制,是先找到同名属
性,然后再赋给对应的变量。真正被赋值的是后
者,而不是前者,前者 foo bar bar 只是一
个别名        
bar // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello' l // 'world'
2.解构也可以用于嵌套结构的对象
let obj = { p: [
'Hello',
{ y: 'World' }
]
};
let { p, [x, { y }] } = obj;
x // "Hello" y // "World"
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let {p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
3.对象的解构也可以指定默认值
var {x = 3} = {}; x // 3
var {x, y = 5} = {x: 1}; x // 1 y // 5
var {x,y = 3} = {}; y // 3
var {x, y = 3} = {x: 5}; y // 5
{ message:msg = 'study hard at ES6' } = {}; msg // " study hard at ES6"
★★ 默认值生效的条件是,对象的属性值严格等于 undefined ★★
var {x = 3} = {x: undefined}; x // 3
var {x = 3} = {x: null}; x // null
已经声明的变量如何解构赋值
// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error
// 正确的写法
let x;
({x} = {x: 1});
// 放在一个圆括号内即可解决
对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量
let json ={
name:'Strive',
age:18,
job:'码农'
};
let {name,age,job}=json;
console.log(name,age,job);
3 字符串的解构赋值
1. 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
a // "h" b // "e" c // "l" d // "l" e // "o"
2 字符串属性解构
let {length : len} = 'hello'; len // 5
4 数组和布尔值和解构赋值[详 const [a, b, c, d, e] = 'hello';
见 api]
5 函数的解构赋值
a. 函数参数的解构
function add([x, y]){
return x + y;
}
add([1, 2]); // 3
b 函数参数的解构使用默认值
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
三、解构赋值的应用
(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)函数参数的定义
(4)提取 JSON 数据
(5)函数参数的默认值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值