ES6之解构赋值

作者原文:http://hawkzz.com/blog/blog/1516004962924

为什么要使用解构

var obj = {
    name:'Jon',
    age:22
};

var name = obj.name;
var age = obj.age;

上面代码是我们以前开发时经常要使用的,从对象和数组中获取数据,并给变量赋值;当对象和数组的数据结构比较复杂时,这种方法就比较麻烦了,有时需要一个个或者遍历;所以ES6添加了解构功能;将数据结构打散的过程变得更加简单,可以从打散后更小的部分中获取所需的信息。

数组解构

1、基本用法

以前,为变量赋值:

let a = 1;
let b = 2;
let c = 3;

ES6赋值:

let [a,b,c] = [1,2,3];
console.log(a);//1
console.log(b);//2
console.log(c);//3

数组解构使用的是数组字面量,且解构操作全部在数组中完成;上面代码中,从数组[1,2,3]中分别解构出来1,2,3这三个值,并赋值给a,b,c;这种写法本质上属于“模式匹配”,只要等号两边的模式相同,就可以通过值在数组中的位置进行选取,并且相对应的赋值;

2、设置默认值

数组解构允许在任意位置指定默认值,当指定位置的元素其值不存在或者为undefined的时候,使用其默认值;

let [x = 3] = [1];
console.log(x);//1

let [y = 4] = [];
console.log(y);//4

let [z = 5] = [undefined];
console.log(z);//5

let [a = 2] = [null];
console.log(a);//null

如果一个数组成员是null,默认值不会生效,因为null === undefined为false;

3、嵌套数组解构

当数组里嵌套一个数组时,即可将数组解构过程深入下一层;

let [a,b,[c,d],e] = [1,2,[3,4],5];

console.log(a);//1
console.log(c);//3

4、解构失败和不完全解构

解构失败出现是因为左边数组的元素比右边的元素多,这样就造成左边变量的值为undefined;

let [a] = [];
console.log(a);//undefined

let [b,c,d] = [1,2];
console.log(b);//1
console.log(c);//2
console.log(d);//undefined

不完全解构表示左边的数组元素比右边的元素少,只能匹配部分右边的元素;

let [a, b, c] = [1, 2, 3, 4];
console.log(a);//1
console.log(b);//2
console.log(c);//3

let [x, [y]] = [1, [2,3]];
console.log(x);//1
console.log(y);//2

如果等号的右边不是数组,那么将会报错;

5、交换变量的值

通常我们要交换两个变量的值都需要使用到第三个变量;

let x = 1;
let y = 2;
let tmp;

tmp = x;
x = y;
y = x;

现在我们使用ES6的数组解构能很方便的实现:

let x = 1;
let y = 2;

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

console.log(x);//2
console.log(y);//1

对象解构

1、基本用法

对象解构语法形式是在一个赋值操作符左边放置一个对象字面量:

let obj = {
    name:'Jon',
    age:22
};

let {name,age} = obj;

console.log(name);//'Jon'
console.log(age);//22

在上面代码中,obj.name解构储存在变量name中,obj.age解构储存在变量age中;对象的解构和数组有一个重要的不同,就是对象的属性没有次序,只要变量名和属性名相同就行;

let {age,name} = obj;
console.log(name);//'Jon'
console.log(age);//22

2、设置默认值

和数组解构一样,对象解构也可以设置默认值;

let {x = 3} = {};
console.log(x);//3

let {y,z = 3} = {y:5};
console.log(y);//5
console.log(z);//3

let {a = 3 ,b} = {};
console.log(a);//a
console.log(b);//undefined

let {c = 3}  = {c:undefined};
console.log(c);//3

let {d = 3} = {c:null};
console.log(d);//3

从上面代码中可以看出,当对象的属性值为undefined或者为空时,默认值才会生效;

3、设置别名

我们现在有这么一个场景,后台给的JSON数据里的属性名和前端定义的变量值不一样;那么就可以通过设置别名来进行结构:

let obj = {
    foo:'Hello',
    bar:'World'
};

let {foo:name,bar} = obj;

console.log(name);//Hello
console.log(bar);//World
console.log(foo);//error:foo is not defined

从上面的代码看出,obj.foo的值赋值给变量name;在这里foo已经不是变量,只是匹配模式,所以无法找到;对象解构赋值的内部机制,是先找到同名属性,然后在赋值给对应的变量;

4、嵌套解构

和数组解构一样,对象解构也可以嵌套:

let obj = {
    line: {
        start: {
            row: 2,
            column: 3
        },
        end: {
            row: 3,
            column: 4
        }
    },
    circle: 9
};

let {line, line: {start}, line: {start: {row}}, circle} = obj;
console.log(line);//{start:{row:2,column:3},end:{row:3,column:4}}
console.log(start);//{row:2,column:3}
console.log(row);//2
console.log(circle);//9

5、已声明变量的解构

给一个已声明的变量解构,是一件很麻烦的事;如果按照以前的方法:

let x ;

{x} = {x:1};//error

会报错,因为JavaScript引擎会将{x}理解城代码块,从而发生语法错误;那如何避免JavaScript将其解释为代码块,就只有让大括号不写在行首;

let x;
({x} = {x:1});
console.log(x);//1

上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。

函数参数解构

1、基本用法

function fn([x, y]) {
    console.log(x + y);
}

fn([1, 2]);//3

function fn2({x, y}) {
    console.log(x * y);
}
fn2({x:1,y:2});//2

从上面代码可以看出,函数参数的解构其实就是变成数组的解构或者对象的解构;

2、设置默认值

函数参数解构可以设置默认值,这样就可以避免缺少值而报错的情况;

function fn({x = 2,y = 3} = {}) {
    console.log([x,y]);
}
fn({x:3,y:4});//[3,4]
fn({x:3});//[3,3]
fn({});//[2,3]
fn();//[2,3]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容

  • 1. const const用来声明常量,一旦声明必须立即初始化,否则报错.作用域与let相同,只在声明所在的块级...
    BubbleM阅读 168评论 0 0
  • 什么是解构? 正统解释:按照一定模式,从数组和对象中提取值,然后对变量进行赋值。 直白理解:模式匹配,映射关系,只...
    贵在随心阅读 2,534评论 0 4
  • 解构赋值 传统的定义多个变量: Es6中为了简单问题简单化,出现了解构赋值这一方法,比如上边的变量可以这样定义: ...
    嘿喵heyMeow阅读 409评论 0 1
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,107评论 0 13
  • 事业 朋友说,自己的得失心太重,所以工作中患得患失的情绪影响到自己工作中的状态。尤其是最近这段时间,公司面临裁员的...
    _七秒_阅读 158评论 0 0