ES6变量的解构赋值

作者: 王阿王 | 来源:发表于2017-11-24 18:30 被阅读0次

概念

ES6允许 按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。

**变量的解构赋值在本质上属于 “模式匹配”,要掌握这个知识点,只需要找准它们的对应关系,并且能准确区分 谁是“模式” 谁是“变量”

数组解构赋值

只要等号两边的模式相同 左边的变量就会被赋与对应的值
var a=1;
var b=2;           =>    let [a,b,c]=[1,2,3]       //a=1;b=2;c=3
var c=3;
不完全解构:等号左边的模式只匹配等号右边数组的一部分。
let [x,y]=[1,2,3]       //x=1;y=2

let [a,[b],d] = [1,[2,3],4]      //a=1;b=2;d=4
报错:如果等号右边不是可遍历的解构(数组),将会报错
let [a]=1;
let [a]=false;
let [a]=NaN;
let [a]=undefined;
let [a]=null;
let [a]={};

解构赋值允许指定默认值
var [foo=true]=[]              //foo=ture
var [x,y='b']=['a']            //x='a';y='b'

默认值也可以引用其他变量,但变量必须已经声明
let [x=1,y=x]=[];       //x=1;y=1
let [x=1,y=x]=[2];       //x=2;y=2
let [x=y,y=1]=[];       //ReferenceError

对象的解构赋值

*对象的属性没有次序,变量必须与属性同名,才能取到正确的值,否则取不到值,最后等于undefined。
//例1
var {foo,bar}={foo:'aaa',bar:'bbb'}   // foo='aaa'  ;bar='bbb'
var {baz}={foo:'aaa',bar:'bbb'}        //baz=undefined

*如果想要声明的变量名与属性名不一样,则必须写成下面这样:
//例2
var {foo:baz}={foo:'aaa',bar:'bbb'}   //baz='aaa'

*对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者。
//例3
var {foo:baz}={foo:'aaa',bar:'bbb'} 
//baz='aaa'
//foo   error:foois not defined   
// 本例中被真正赋值的是baz 而不是模式foo

//**由上可知,例1中对象的解构赋值 其实是一种简写
var {foo,bar}={foo:'aaa',bar:'bbb'}   =>
var {foo:foo,bar:bar}={foo:'aaa',bar:'bbb'} 

(ES6允许在对象中只写属性名,不写属性值,这个时候,属性值等于属性名字所代表的变量)
var baz={foo} => var baz={foo:foo}
#####解构嵌套结构的对象

var obj={
   p:[
      "hello",
      {y:''word"}
   ]
};
var {p:[x,{y}]}=obj;
//x=>"hello"
// y => "world"
// p => error: p is not defined
*这时p 是模式,不是变量,因此不会被赋值
对象的解构也可以指定默认值
var {x=3}={}    // x=>3
var {x,y=5}={x;1}     //x=>3    y=>5
var {x:y=9}={}      //y=>9   

字符串的解构赋值

此时字符串被转换成了一个类似数组的对象
const [a,b,c,d,e]="hello" 
// a => "h"
// b => "e"
// c => "l"
// d => "l"
// e => "0"

****类似数组的对象都有length属性,因此还可以对这个属性解构赋值。***
let {lebgth:len}="hello"
//len => 5

数值和布尔值的解构赋值

解构赋值的规则是,只要等号右边的值不是对象,就先将起转化为对象,所以数值和布尔值的解构赋值,会先将起转为对象,因此,需要注意的是,undefined和null 无法转为对象,所以对它们进行解构赋值都会报错。

函数参数的解构赋值

function add([x,y]) {
   return x+y
}
add([1,2])    //3

函数add的参数实际上不是一个数组,是通过解构得到的变量 x 和y

#####函数参数 解构使用默认值
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()   //[00]

用途

1、交换变量的值

var [x,y] =[y,x]

2、提取JSON数据

var json={
   id:42,
   status: "ok",
   data:[867,5309]
}

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

3、指定函数参数默认值,省去在函数体内部 再写 var foo=config.foo|| "default foo" 短路写法
$.ajax = function (url,{
async=true,
cache = true
})

4、输入模块的指定方法
let {formData,pxTorem,foo}= improt '../../index.js';

相关文章

  • 解构赋值

    解构赋值:ES6 中新增了变量赋值的方式,从数组和对象中提取值,对变量进行赋值。 单独赋值给变量,解构赋值。 解构...

  • ES6

    ES6: ES6 新语法 1.变量 解构赋值 (解构赋值对应的python里的序列解包) 解构赋值方式一: 解构赋...

  • ES6笔记(解构赋值)

    ES6笔记(解构赋值) 解构赋值 变量的解构: 解构赋值允许指定默认值。 解构赋值必须保证赋值方 被赋值方类型一...

  • 『ES6脚丫系列』变量的解构赋值

    『ES6脚丫系列』变量的解构赋值 第一章:变量的解构赋值的概念 【01】Q:什么是变量的解构赋值?有哪些方式? 吃...

  • ES6知识点复习(二)

    变量的解构赋值 解构赋值允许指定默认值,es6内部使用严格相等运算符 === 默认值可以引用解构赋值的其他变量,但...

  • es6中的解构赋值

    es6中的对象解构赋值 对象的解构赋值,新变量名字要和对象中的变量名一致 数组中的解构赋值,数组是依次赋值的 字符...

  • ES6入门笔记

    变量的解构赋值 数组的解构赋值ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Dest...

  • ES6学习笔记——解构赋值

    变量的结构赋值 数组的解构赋值 ES6允许从数组中提取值,按照对应的位置,对变量赋值。 如果解构不成功,变量的值就...

  • 杂货小铺之ES6+ 🍳 解构赋值

    解构赋值 ? 在 ES6 中新增了变量赋值的方式:解构赋值。允许按照一定模式,从数组和对象中提取值,对变量进行赋值...

  • 26

    ES6 一、解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为结构赋值,解构赋值主要...

网友评论

    本文标题:ES6变量的解构赋值

    本文链接:https://www.haomeiwen.com/subject/mcefbxtx.html