php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 768|回复: 0

[JavaScript]解构赋值详解

[复制链接]

2871

主题

2881

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7283
贡献
0
注册时间
2021-4-14
最后登录
2024-9-19
在线时间
715 小时
QQ
发表于 2022-1-21 20:17:36 | 显示全部楼层 |阅读模式
文章目录
概念
数组解构
声明分别赋值
解构默认值
交换变量值
解构函数返回的数组
忽略返回值(或跳过某一项)
赋值数组剩余值给一个变量
嵌套数组解构
字符串解构
对象解构
基础对象解构
赋值给新变量名
解构默认值
赋值给新对象名的同时提供默认值
同时使用数组和对象解构
不完全解构
赋值剩余值给一个对象
嵌套对象解构(可忽略解构)
注意事项
小心使用已声明变量进行解构
函数参数的解构赋值
解构的用途
交换变量的值
从函数返回多个值
提取JSON数据


概念
ES6提供了更简洁的赋值模式,从数组和对象中提取值,这被称为解构

示例:
[mw_shl_code=applescript,true][a, b] = [50, 100];
console.log(a);
// expected output: 50
console.log(b);
// expected output: 100

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest);
// expected output: [30, 40, 50]
[/mw_shl_code]
数组解构
数组解构是非常简单简洁的,在赋值表达式的左侧使用数组字面量,数组字面量中的每个变量名称映射为解构数组的相同索引项

这是什么意思呢,就是如下面这个示例一样,左边数组中的项分别得到了右侧解构数组相应索引的值
[mw_shl_code=applescript,true]let [a, b, c] = [1, 2, 3];
// a = 1
// b = 2
// c = 3
[/mw_shl_code]
声明分别赋值
你可以通过变量声明分别解构赋值

示例:声明变量,分别赋值
[mw_shl_code=applescript,true]// 声明变量
let a, b;
// 然后分别赋值
[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
[/mw_shl_code]
解构默认值
如果解构取出的值是undefined,可以设置默认值:
[mw_shl_code=applescript,true]let a, b;
// 设置默认值
[a = 5, b = 7] = [1];
console.log(a); // 1
console.log(b); // 7
[/mw_shl_code]
在上面的例子中,我们给a和b均设置了默认值
这种情况下,如果a或b的值是undefined,它将把设置的默认值赋给相应变量(5赋给a,7赋给b)

交换变量值
以往我们进行两个变量的交换,都是使用
[mw_shl_code=applescript,true]//交换ab
c = a;
a = b;
b = c;
[/mw_shl_code]
或者异或的方法

然而在解构赋值中,我们可以在一个解构表达式中交换两个变量值
[mw_shl_code=applescript,true]let a = 1;
let b = 3;
//交换a和b的值
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
[/mw_shl_code]
解构函数返回的数组
我们可以直接解构一个返回值为数组的函数
[mw_shl_code=applescript,true]function c() {
  return [10, 20];
}

let a, b;
[a, b] = c();
console.log(a); // 10
console.log(b); // 20
[/mw_shl_code]
在上面的例子中,**c()**的返回值[10,20]可以在单独的同一行代码中使用解构

忽略返回值(或跳过某一项)
你可以有选择性的跳过一些不想得到的返回值
[mw_shl_code=applescript,true]function c() {
  return [1, 2, 3];
}

let [a, , b] = c();
console.log(a); // 1
console.log(b); // 3
[/mw_shl_code]
赋值数组剩余值给一个变量
当你使用数组解构时,你可以把赋值数组剩余的部分全部赋给一个变量
[mw_shl_code=applescript,true]let [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]
[/mw_shl_code]
这样的话b也会变成一个数组了,数组中的项是剩余的所有项

注意:
这里要小心结尾是不能再写逗号的,如果多了一个逗号将会报错
let [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma

嵌套数组解构
像对象一样,数组也可以进行嵌套解构

示例:
[mw_shl_code=applescript,true]const color = ['#FF00FF', [255, 0, 255], 'rgb(255, 0, 255)'];

// Use nested destructuring to assign red, green and blue
// 使用嵌套解构赋值 red, green, blue
const [hex, [red, green, blue]] = color;
console.log(hex, red, green, blue); // #FF00FF 255 0 255
[/mw_shl_code]
字符串解构
在数组解构中,解构的目标若为可遍历对象,皆可进行解构赋值,可遍历对象即实现Iterator接口的数据
[mw_shl_code=applescript,true]let [a, b, c, d, e] = 'hello';
/*
a = 'h'
b = 'e'
c = 'l'
d = 'l'
e = 'o'
*/
[/mw_shl_code]
对象解构
基础对象解构
[mw_shl_code=applescript,true]let x = { y: 22, z: true };
let { y, z } = x; // let {y:y,z:z} = x;的简写

console.log(y); // 22
console.log(z); // true
[/mw_shl_code]
赋值给新变量名
当使用对象解构时可以改变变量的名称
[mw_shl_code=applescript,true]let o = { p: 22, q: true };
let { p: foo, q: bar } = o;

console.log(foo); // 22
console.log(bar); // true
[/mw_shl_code]
如上代码var {p: foo} = o 获取对象 o 的属性名 p,然后赋值给一个名称为 foo 的变量

解构默认值
如果解构取出的对象值是undefined,我们可以设置默认值
[mw_shl_code=applescript,true]let { a = 10, b = 5 } = { a: 3 };

console.log(a); // 3
console.log(b); // 5
[/mw_shl_code]
赋值给新对象名的同时提供默认值
前面提到过我们赋值给新的对象名,这里我们可以给这个新的对象名提供一个默认值,如果没有解构它,就会自动使用默认值
[mw_shl_code=applescript,true]let { a: aa = 10, b: bb = 5 } = { a: 3 };

console.log(aa); // 3
console.log(bb); // 5
[/mw_shl_code]
同时使用数组和对象解构
在结构中数组和对象可以一起使用
[mw_shl_code=applescript,true]const props = [
  { id: 1, name: 'Fizz' },
  { id: 2, name: 'Buzz' },
  { id: 3, name: 'FizzBuzz' },
];

const [, , { name }] = props;
console.log(name); // "FizzBuzz"
[/mw_shl_code]
不完全解构

let obj = {p: [{y: 'world'}] };
let {p: [{ y }, x ] } = obj;//不解构x

// x = undefined
// y = 'world'

赋值剩余值给一个对象

let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}

嵌套对象解构(可忽略解构)
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello'
// y = 'world'

let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, {  }] } = obj;//忽略y
// x = 'hello'

注意事项
小心使用已声明变量进行解构
错误示范:
let x;
{x} = {x: 1};

JavaScript引擎会将{x}理解为一个代码块,从而产生语法错误,我们要避免将大括号写在行首,避免JavaScript将其解释为代码块
正确写法:
let x;
({x} = {x: 1});

正确写法将整个解构赋值语句放在一个圆括号里,就可以正确执行了

函数参数的解构赋值
函数的参数也可以使用解构赋值
function add([x, y]) {
        return x + y;
}

add([1, 2]);

上面代码中,函数add的参数表面上是一个数组,但在传参的时候,数组参数就被解构为变量x和y了,对于函数内部来说,就和直接传入x和y是一样的

解构的用途
解构赋值的用法很多

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

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

上面的代码交换x和y的值,这样的写法不仅简洁而且易读,语义清晰

从函数返回多个值
函数只能返回一个值,如果要返回多个值,我们只能将这些值放置数组或对象里返回,当我们有了解构赋值后,从对象或数组里取出这些值犹如探囊取物
[mw_shl_code=applescript,true]// 返回一个数组

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

// 返回一个对象

function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();
[/mw_shl_code]
提取JSON数据
解构赋值对于提取JSON对象中的数据,尤其有用

示例:
[mw_shl_code=applescript,true]let jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

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

console.log(id, status, number);
// 42, "OK", [867, 5309]
[/mw_shl_code]
使用上面的代码,我们就可以快速取出JSON数据中的值

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-9-20 05:51 , Processed in 0.188212 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表