我们经常可以在其他编程语言(如GO语言)中看到多返回值这种特性,因为在很多实际场景中,函数的返回值中,函数的返回值并不只有一个单一的值。ES6之前,并没有可以直接使用语法来实现多返回值的特性。ES6终于出现了解构赋值的语法糖来解决此类问题。
解构赋值是一种表达式,允许您使用数组或对象,将可迭代对象的值或属性分配给变量。解构赋值能让我们用更简短的语法进行多个变量的赋值,大大的减少了代码量。解构表达式有两种:array和object。
今天的文章笔者将从以下方面进行介绍:
- 使用数组表达式解构赋值
- 常规用法
- 忽略数组中的某些值
- 使用展开语法
- 默认参数值
- 嵌套数组解构
- 作为函数参数
- 使用对象表达式解构赋值
- 常规用法
- 默认参数值
- 嵌套对象
- 作为函数参数
- 其他
- 解构对象的方法
- 获取字符串长度
- 拆分字符串
- 交换变量
- 遍历Map结构
- 加载指定模块的方法
- 常用场景介绍
使用数组表达式解构赋值
常规用法
如何将一个数组的值,赋值给多个变量?数组解构语法能让我们快速的迭代数组的元素,并赋值给多个变量。
E6之前,我们可以这种形式将数组的内容赋值给多个变量:
var myArray = [1, 2, 3]; var a = myArray[0]; var b = myArray[1]; var c = myArray[2];
ES6后,我们可以通过数组解构语法,在一行语句里完成上述操作。
let myArray = [1, 2, 3]; let a, b, c; [a, b, c] = myArray; //array destructuring assignment syntax
上述代码中,[a, b, c]就是解构表达式。在数组解构语句的左侧就是需要进行赋值的多个变量,等号右侧则是我们需要分配的值。
我们还可以让上述代码更短,你还可以这么写,代码如下:
let [a, b, c] = [1, 2, 3];
我们在同一行语句中创建变量,而不是分别创建。是不是更清爽。
如果左边的数值少于右边数组的项数,左边变量的值只会和右边数组的内容一一对应,多于的内容将会忽略。
忽略数组中某些值
如果只有两个变量,我们数组内容有三项,我们想跳过数组中的第二项,我们如何使用数组解构赋值呢?代码如下:
let [a, , b] = [1, 2, 3]; console.log(a); console.log(b);
上述代码我们使用, ,忽略数组中的第二项,建议中间有空格,方便我们阅读。
使用展开语法
上篇文章 《【ES6基础】展开语法(Spread syntax)》 ,笔者介绍了展开语法的几个应用场景,由于上篇文章没介绍解构赋值,所以在这里给大家介绍展开语法在解构赋值的应用。如下段代码所示:
let [a, ...b] = [1, 2, 3, 4, 5, 6]; console.log(a); console.log(Array.isArray(b)); console.log(b);”
上述代码则会输出:
1
true
2,3,4,5,6
上述代码,你可以看到b变量被解构赋值成数组,这里...就是我们上篇文章提到的剩余参数场景的运用。
如果想跳过数组中的部分值,我们可以这么做,如下段代码所示:
let [a, , ,...b] = [1, 2, 3, 4, 5, 6]; console.log(a); console.log(b);
上述代码则会输出:
1
4,5,6
这段代码我们跳过了数组的第2项和第3项。
默认参数值
笔者在 《【ES6基础】默认参数值》 给大家介绍了如何使用默认参数值,在解构赋值中,我们如何设置变量的默认值呢,如下段代码所示:
let [a, b, c = 3] = [1, 2]; console.log(c); //Output "3”
嵌套数组
我们还可以从多维数组中提取值并分配给变量,如下段代码所示:
let [a, b, [c, d]] = [1, 2, [3, 4]];
作为函数参数
我们还可以使用数组解构表达式作为函数参数来提取可迭代数组的值,作为参数传递给函数参数,如下段代码所示:
function myFunction([a, b, c = 3]) { console.log(a, b, c); //Output "1 2 3" } myFunction([1, 2]);
笔者在《【ES6基础】默认参数值》 提及到我们可以传递undefined,指定某个具体的参数使用默认值,我们可以使用结构赋值为相关变量提供一组默认值,并传入undefined,如下段代码所示:
function myFunction([a, b, c = 3] = [1, 2, 3]) { console.log(a, b, c); //Output "1 2 3" } myFunction(undefined);
在这里,我们将undefined作为参数传递,因此使用默认数组[1,2,3]进行提取赋值。
使用对象表达式解构赋值
常规用法
对象解构赋值将对象属性的值赋给多个变量。ES6之前我们可以这样把对象的属性赋值给多个变量,如下段代码所示:
var object = {name : "John", age : 23}; var name = object.name; var age = object.age;
在ES6里,我们可以使用对象解构表达式,在单行里给多个变量赋值,如下段代码所示:
let object = {name : "John", age : 23}; let name, age; ({name, age} = object); //object destructuring assignment syntax
对象解构赋值的左侧为解构赋值表达式,右侧为对应要分配赋值的对象。解构语句的两边千万 不要遗漏左右括号() ,否则会报错。
还有一点需要格外注意,解构对象 变量的名称一定要和右边对象的属性名称保持一致 ,否则会提示变量的值为undefined。如果你想以其它的变量名进行命名,你可以这么做,如下段代码所示:
let object = {name : "John", age : 23}; let x, y; ({name: x, age: y} = object);
上述代码x,y为对应对象属性的值John,23。如果你输出name或age,编译器则会提示ReferenceError: 变量 is not defined
我们可以让代码更短,如下段代码所示:
let {name: x, age: y} = {name : "John", age : 23};
上述代码由于声明变量和解构赋值在同一行,因此对象解构语句两边无需左右括号()。
默认参数值
在解构对象针对未分配值的变量,我们可以为变量提供默认值,如下段代码所示:
let {a, b, c = 3} = {a: "1", b: "2"}; console.log(c); //Output "3”
在解构对象时变量名支持表达式计算,如下段代码所示:
let {["first"+"Name"]: x} = { firstName: "Eden" }; console.log(x); //Output "Eden”
嵌套对象
我们还可以从嵌套对象中提取属性值,即对象中的对象。 如下段代码所示:
let {name, otherInfo: {age}} = {name: "Eden", otherInfo: {age:23}}; console.log(name, age); //Eden 23
作为函数参数
就像数组解构赋值一样,我们也可以使用对象解构赋值作为函数参数,如下段代码所示:
function myFunction({name = 'Eden', age = 23, profession ="Designer"} = {}){ console.log(name, age, profession); // Outputs "John 23 Designer" } myFunction({name: "John", age: 23});
在这里,我们传递一个空对象作为默认参数值,如果将undefined作为函数参数传递,变量将使用默认值。
其他
解构对象的方法
比如结构Math对象的方法,如下段代码所示:
let {floor,pow}=Math;//把Math里的方法提取出来变成一个变量 let a=1.1; console.log(floor(a));//1 console.log(pow(2,3));//8
获取字符串的长度
var {length}='lxy'; console.log(length);//3
拆分字符串
var [a,b,c,d]='前端达人'; console.log(a,b,c,d) // 输出:前 端 达 人
交换变量
let x = 1; let y = 2; [x, y] = [y, x];
遍历Map结构
var map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for (let [key, value] of map) { console.log(key + " is " + value); }
加载指定模块的方法
const { SourceMapConsumer, SourceNode } = require("source-map");
常用场景介绍
比如我们经常与后端API接口做数据交互,我们需要处理返回的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]
小节
今天的内容有些多,想必大家对解构赋值有了全面的认识吧,使用解构赋值是不是很强大,大大简化了我们的代码量,虽然优势蛮多,但是增加对代码的理解难度,我们只有在实践中不断的运用,来加深我们对解构赋值的认识。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】