JavaScript学习笔记_ES6_解构赋值

JavaScript中的结构赋值也是Mozilla项目率先提出和实现的。
解构赋值是从赋值运算符(=)右侧的对象或数组中提取值,对变量进行赋值。在解构赋值中,如果赋值运算符右侧部分不是数组或对象,就先将其转为对象,因此无法结构undefined和null。类型转换知识点传送门!!!

数组模型解构

解构赋值可以从赋值运算符右侧的数组中提取值,并按照对应的位置,对左侧的变量赋值。只要赋值运算符左右两侧的位置(或模式)对应,左侧的变量就能成功赋值。

let [a, b, c] = [1, 2, 3] // 等价于 let a=1, b=2, c=3
console.log(a, b, c)    // 1 2 3
嵌套解构
// 允许嵌套,只要左右两侧的位置(模式)匹配即可
let [a, [b, [c]], d] = [1, [2, [3]], 4] // 等价于 let a=1, b=2, c=3, d=4
console.log(a, b, c, d)    // 1 2 3 4
忽略值
// 忽略了值1和3
let [, x, , y] = [1, 2, 3, 4] // 等价于let x = 2, y = 4
console.log(x, y)   // 2 4
不完全解构
// 不完全解构,右侧值的个数少于变量的个数
let [x, y] = [1] // 等价于let x = 1, y = undefined
剩余运算符

剩余运算符变量是个数组,相当于给数组赋值。

let [a, ...b] = [1, 2, 3]
a   // 1
b   // [2, 3]
解构可遍历对象

可遍历对象是实现Iterator接口的数据,可以理解为类数组数据,比如字符串,Set,dom中的NodeList等。

let [a, b, c] = 'JavaScript'
a   // 'J'
b   // 'a'
c   // 'v'
let s = new Set()
s.add(1)
s.add(5)
s.add("some text") 
let [x, y, z] = s
x   // 1
y   // 2
z   // 'some text'
默认值

当解构模式有匹配结果,且匹配结果是undefined时,使用默认值。

let [a = 3] = []    // a首先匹配到undefined,使用默认值3
a // 3
let [b = 1, c = b] = [3]    // b匹配到3,b=3;c匹配到undefined,使用c=b
b   // 3
c   // 3
let [d = 1, e = 1] = [5, 6] // d匹配到5,d=5;e匹配到6,e=6
d   // 5
e   // 6

对象模型解构

从赋值运算符右侧提取出key、value,并在赋值运算符左侧寻找相同的key,当寻找到相同的key后,会将左侧key对应的value当作变量名,并将右侧的value赋值给它。

基本用法
let {a, b} = {a: 1, b: 2} // 等价于let {a: a, b: b} = {a: 1, b: 2}
a   // 1
b   // 2
let {baz: foo} = {baz: 'foo'}   // 等价于let foo = 'foo'
foo     // 'foo'
// 两侧的key顺序可以不一致。
let {h: t, i: r} = {i: 'r', h: 't'} 
t   // 't'
r   // 'r'
可嵌套
let obj = {p: ['hello', {y: 'world'}] }
let {p: [x, { y }] } = obj
/**
 * 解构步骤
 * 1. 按照对象模型解构,匹配p,得到[x, {y}] = ['hello', {y: 'world'}]
 * 2. 将步骤1得到的结果按数组模型解构,得到x = 'hello'和 {y} = {y: 'world'}对象模型解构
 * 3. 将步骤2得到的对象模型解构为 y = 'world'
 */
x   // 'hello'
y   // 'world'
可忽略
let obj = {p: {x: 'hello', q: {y: 'world'}} }
let {p: {x} } = obj
/**
 * 解构步骤
 * 1. 按照对象模型解构,匹配p,得到{x} = {x: 'hello', {y: 'world'}}
 * 2. 将步骤1得到的结果按对象模型解构,得到x = 'hello',并将q: {y: 'world'}忽略
 */
x   // 'hello'
不完全解构
let obj = {p: [{y: 'world'}] }
let {p: [{ y }, x ] } = obj
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 {a = 10, b = a} = {a: 3}
a   // 3
b   // 3
let {a: aa = 10, b: bb = 5} = {a: 50}
aa  // 50
bb  // 5

解构undefined和null

let { prop: x } = undefined
let { prop: y } = null
// TypeError: Cannot destructure property `prop` of 'undefined' or 'null'.

函数参数解构

function sum ([a = 3, b]) {
    return a + b
}
sum([1, 2])         // 3

function multiply ({a, b = 4}) {
    return a * b
}
multiply({a: 9})    // 36

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

推荐阅读更多精彩内容

  • 前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段。在ES6中添加了可以简化这种任务的新特性...
    sunnyghx阅读 749评论 0 0
  • 前面的话   我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段。在ES6中添加了可以简化这种任务的新...
    CodeMT阅读 511评论 0 0
  • 引入 在ES5中,开发者们为了从对象和数组中获取特定数据并赋值给变量,编写了许多看起来同质化的代码 这段代码从op...
    nengzhuan_zhang阅读 621评论 0 0
  • 本文是一系列就阮一峰的《ECMAScript 6 入门》的学习笔记。附上篇零:ES6学习笔记 篇零 变量声明 JS...
    MollyFool阅读 4,091评论 0 0
  • 小的时候,家里养了一条灰色的土狗,记忆中十分消瘦,却很有精神,很有一股野的天性。 ...
    渴死渔夫阅读 344评论 0 2