好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ES6+ 解构赋值

ES6+ 解构赋值

1. 前言

本节我们会学习到 ES6 中的解构赋值语法,它是 JavaScript 中的一种表达式。在本节中你可以了解以下 内容 :

什么是解构赋值 数组的解构赋值 对象的解构赋值 如何解构嵌套对象和数组

解构赋值就是分解 一个 数据的结构,并从这数据解构中 提取 数据的过程,它可以从数组中取出值赋给变量或是将对象中的 属性 提取 出来赋给另 一个 对象的 属性 。 解构的目的是为了简化 提取 数据的过程,增强 代码 的可读性。 把变量放在 [] 或者 {} 中来 获取 目标对象上的对应的值。

2. 数组的解构赋值

2.1 基本 用法

数组的解构赋值是,通过新建 一个 数组,数组内的变量和目标数组是一一对应的,按照索引的方式去 获取 值,然后赋值给指定索引上的变量。在 ES6 之前,想 获取 数组中的值,需要通过 Array[index] 的方式来 获取 值,这种方式的好处在于可以 获取 数组上指定索引的值,如果我们想把数组的每一项的值都取出来,赋给变量,这样的写法就显得很笨拙:

  var  arr  =   [  ,   ]  ; 
console .  log  ( arr [  ]  )  ;    // 10 
console .  log  ( arr [  ]  )  ;    // 20 
 

上面的取值方式是 ES6 之前的写法,有了 ES6 的解构赋值就简单了很多,下面看 ES6 解构赋值是怎么取数组的对应值的:

  var   [ a ,  b ]   =   [  ,   ]  ; 
console .  log  ( a )  ;     // 10 
console .  log  ( b )  ;     // 20 
 

上面的例子中先声明 一个 数组,分别在数组的 0 和 1 的索引位置上放置变量 a 和 b,对应着需要 获取 数组的索引位置,这样就可以从数组当中取到我们想要的值了。

2.2 默 认值

在解构 一个 未知的数组时,需要对未能取的值的变量赋 一个 默 认值,为了防止从数组中取出 一个 值为 undefined 的对象,可以在表达式的左边的数组中为任意变量预设 一个 默 认的值。

  let   [ a =  ,  b =  ]   =   [  ]  ;               // a=1 b=9 
 let   [ a ,  b  =   ]   =   [  ,   ''  ]  ;          // a=10, b='' 
 let   [ a ,  b  =   ]   =   [  ,  undefined ]  ;   // a=10, b=1 
 

Tips: 在 ES6 中,判断 一个 数组中是否有值,使用严格相等运算符(===)来进行判断,只有当 一个 数组成员严格等于 undefined, 默 认值才会生效。所以第三个 b 使用了 默 认值。

  let   [ a  =   ]   =   [  null  ]  ;               // a=null 
 

我们知道 null==undefined 返回的是 true, null===undefined 返回的是 false。所以数组成员是 null, 默 认值就不会生效。

2.3 交换变量

在 ES6 之前如果我们想交换两个变量的值时,我们需要借助 一个 中 间的 值来过渡,下面是要交换 a、b 值的过程:

  var  a  =   ; 
 var  b  =   ; 
 var  m  =  a ; 
a  =  b ; 
b  =  m  // a=4, b=1 
 

在交换 a、b 值时,需要借助中 间的 变量来中转,使用 ES6 解构赋值就很简单:

  var  a  =   ; 
 var  b  =   ; 
 [ a ,  b ]   =   [ b ,  a ]   // a=4, b=1 
 

2.4 跳过某项值使用逗号隔开

在解构数组时,可以忽略不需要解构的值,可以使用逗号对解构的数组进行忽略操作,这样就不需要声明更多的变量去存值了:

  var   [ a ,   ,   ,  b ]   =   [  ,   ,   ,   ]  ; 
console .  log  ( a )  ;     // 10 
console .  log  ( b )  ;     // 40 
 

上面的例子中,在 a、b 中间用逗号隔开了两个值,这里怎么判断间隔几个值呢,可以看出逗号之间组成了多少间隔,就是间隔了多少个值。如果取值很少的情况下可以使用下标索引的方式来 获取 值。

2.5 剩余参数中的使用

通常情况下,需要把剩余的数组项作为 一个 单独的数组,这个时候我们可以借助展开语法把剩下的数组中的值,作为 一个 单独的数组,如下:

  var   [ a ,  b ,   ... rest ]   =   [  ,   ,   ,   ,   ]  ; 
console .  log  ( a )  ;       // 10 
console .  log  ( b )  ;       // 20 
console .  log  ( rest )  ;    // [30, 40, 50] 
 

在 rest 的后面不能有 逗号 不然会报错,程序会认出你后面还有值。 ...rest 是剩余参数的解构,所以只能放在数组的最后,在它之后不能再有变量,否则则会报错。

3. 对象的解构赋值

3.1 基本 用法

对象的解构和数组基本类似,对象解构的变量是在 {} 中定义的。对象没有索引,但对象有更明确的键,通过键可以很方便地去对象中取值。在 ES6 之前直接使用键取值已经很方便了:

  var  obj  =   {  name :   'imooc'  ,  age :    }  ; 
 var  name  =  obj . name ;    // imooc 
 var  age  =  obj . age ;      // 7 
 

但是在 ES6 中通过解构的方式,更加简洁地对取值做了简化,不需要通过点操作 增加 额外的取值操作。

  var  obj  =   {  name :   'imooc'  ,  age :    }  ; 
 var   {  name ,  age  }   =  obj ;    // name: imooc, age: 7 
 

在 {} 直接声明 name 和 age 用逗号隔开即可得到目标对象上的值,完成声明赋值操作。

3.2 默 认值

对象的 默 认值和数组的 默 认值一样,只能通过严格相等运算符(===)来进行判断,只有当 一个 对象的 属性 值严格等于 undefined , 默 认值才会生效。

  var   { a  =   ,  b  =   }   =   { a :   }  ;                   // a = 3, b = 5 
 var   { a  =   ,  b  =   }   =   { a :   ,  b :  undefined }  ;     // a = 3, b = 5 
 var   { a  =   ,  b  =   }   =   { a :   ,  b :   null  }  ;          // a = 3, b = null 
 

所以这里的第二项 b 的值是 默 认值,第三项的 null === undefined 的值为 false,所以 b 的值为 null。

3.3 重命名 属性

在对象解构出来的变量不是我们想要的变量命名,这时我们需要对它进行 重命名 。

  var   { a : x  =   ,  b : y  =   }   =   { a :   }  ; 

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

这里把 a 和 b 的变量名重新命名为 x 和 y。

3.4 剩余参数中的使用

在对象的解构中也可以使用剩余参数,对对象中没有解构的剩余 属性 做聚合操作, 生成 一个 新的对象。

  var   { a ,  c ,   ... rest }   =   { a :   ,  b :   ,  c :   ,  d :   } 
console .  log  ( a )  ;       // 1 
console .  log  ( c )  ;       // 3 
console .  log  ( rest )  ;    // { b: 2, d: 4 } 
 

对象中的 b、d 没有被解构,通过剩余参数语法把没有解构的对象 属性 聚合到一起形成新的对象。

4. 解构字符串

当然字符串也是可以被解构的,字符串可以当作数组被解构。

  const   [ a ,  b ,  c ,  d ,  e ]   =   'imooc'  ; 
console .  log  ( a )  ;     // "i" 
console .  log  ( b )  ;     // "m" 
console .  log  ( c )  ;     // "o" 
console .  log  ( d )  ;     // "o" 
console .  log  ( e )  ;     // "c" 
 

字符串可以被看成类数组的东西,类似数组的对象都有 一个 length 属性 ,字符串也可以被当作对象来解构,但是由于字符串 方法 只有 length 属性 ,所以只能解构出 length 的值。

  let   { length  :  len }   =   'hello'  ; 
console .  log  ( len )  ;   // 5 
 

5. 解构复杂的数据结构

了解了数组和对象的解构,下面我们看下对于复杂数据解构应该如何去解构呢?看下面的例子:

  var  data  =   { 
  a :   , 
  arr :   [ 
     { 
      b :   , 
      c :  
     } 
   ] 
 } 

 var   {  
  a :  newA , 
  arr :   [ 
     { 
      b :  newB
     } 
   ] 
 }   =  data ; 
console .  log  ( newA ,  newB )   // 1, 2 
 

上面的例子中 data 的数据解构还算是比较复杂的,对于解构这种既有对象又有数组的数据解构,我们要先声明 一个 和目标对象有着相同的数据嵌套,才能去拆解目标对象。这里解构的是 data 中的 a 和 b 的值,而且把 a 和 b 重命名 为 newA 和 newB。

6. 小结

本节讲解了 ES6 解构赋值的使用 方法 ,总结下来一共有以下几点:

解构赋值一般针对对象和数组,如果解构对象是 undefined 或是 null 都会报错; 默 认值的生效条件是,只有当解构的对象的值是严格模式下的 undefined 的情况下, 默 认值才会生效; 可以不借助中间变量来交换两个值; 在解构复杂的数据解构时,注意声明的对象要和目标的对象有着相同的解构形式,才能去解构目标对象。

查看更多关于ES6+ 解构赋值的详细内容...

  阅读:51次

上一篇

下一篇

第1节:ES6+ 简介    第2节:ES6 环境配置    第3节:ES6+ let    第4节:ES6+ const    第5节:ES6+ 展开语法    第6节:ES6+ 剩余参数    第7节:ES6+ 解构赋值    第8节:ES6+ 模版字符串    第9节:ES6+ 箭头函数    第10节:ES6+ 数值扩展    第11节:ES6+ isFinite()&isNaN()    第12节:ES6+ Number 对象的方法    第13节:ES6+ Math 对象的扩展    第14节:ES6+ includes()    第15节:ES6+ 字符串的扩展    第16节:ES6+ startsWith()    第17节:ES6+ endsWith()    第18节:ES6+ repeat()    第19节:ES6+ padStart()    第20节:ES6+ padEnd()    第21节:ES6+ trim()    第22节:ES6+ Array.from()    第23节:ES6+ of()    第24节:ES6+ find()和findIndex()    第25节:ES6+ copyWithin()    第26节:ES6+ fill()    第27节:ES6+ isArray()    第28节:ES6+ 对象的扩展    第29节:ES6+ flat()    第30节:ES6+ 可选链操作符    第31节:ES6+ Object.is()    第32节:ES6+ Object.assign()    第33节:ES6+ Object.keys()    第34节:ES6+ Object.values()    第35节:ES6+ Object.entries()    第36节:ES6+ 数据结构扩展    第37节:ES6+ Set    第38节:ES6+ WeakSet    第39节:ES6+ Map    第40节:ES6+ WeakMap    第41节:ES6+ Symbol    第42节:ES6+ for...of    第43节:ES6+ 迭代协议    第44节:ES6+ 实现一个简版的 Promise    第45节:ES6+ Promise 基础    第46节:ES6+ Promise 进阶    第47节:ES6+ Generator 基础    第48节:ES6+ Generator 函数应用    第49节:ES6+ async/await    第50节:ES6+ Class 前置知识    第51节:ES6+ Class    第52节:ES6+ Proxy    第53节:ES6+ Reflect(一)    第54节:ES6+ Reflect(二)    第55节:ES6+ 模块化(一)    第56节:ES6+ 模块化(二)    第57节:ES6实战1-实现Vue3 reactive 源码    第58节:ES6实战2-实现 Vue3 effect 源码    第59节:ES6 实战2-封装请求    第60节:ES6+ 实战3-代码整洁之道    第61节:ES6 Map原理分析    第62节:ES6module语法加载importexport    第63节:ES6的循环与可迭代对象示例详解