哎,我真的是太难了,今天就被这个解构赋值(也可以叫做析构,貌似析构是在c++中的,所以我这里叫做解构赋值吧)弄的我很烦,本来以为很容易的,结果还是弄了好久。。。就总结一下解构吧!

1.解构的基本使用

  什么叫做解构呢?其实就是类似正则表达式的这么一个东西,就是用一个有规则的表达式去匹配一个对象,这个表达式中刚好有一些属性,只要是匹配到了的东西都会自动赋值给这些属性,然后这个属性我们就可以随便使用了,所以通用的写法应该是下面这个样子的(这里是对象类型的解构,对于数组类型的解构比较容易,不多说,自己查一下资料就ok了):

//方式一,左边的表达式和右边的属性一 一对应,左边的顺序可以随意
let [属性2,属性1,属性3]={属性1:x,属性2:xx,属性3:xxx} //方式二,我们想换一下属性名,那么左边的表达式就需要用冒号将匹配到的值再赋值给冒号后面的变量,最后再返回给我们使用
let [属性2:attr2,属性1:attr1,属性3:attr3]={属性1:x,属性2:xx,属性3:xxx}  

  

  举个例子:

 let {newName:nm,oldName:om}={oldName: '小王', newName: '老王'}
console.log(nm);//老王
console.log(om);//小王

  很舒服的是左边还可以设置默认值,匹配得到就用匹配到的值,没有匹配到就使用默认的值:

 let {newName:nm='小李',oldName:om}={oldName: '小王'}
console.log(nm);//小李
console.log(om);//小王

  但是什么叫做没有匹配到呢?比如下面这个例子,右边根本就没有newName这个属性,这叫做没有匹配到,如果右边的newName为undefined也表示没有匹配到;但是:如果newName的值是null,这是匹配到了!!

 let {newName:nm='小李',oldName:om,midName:mn='中间人'}={oldName: '小王', newName: null,midName:undefined}
console.log(nm);//null,匹配到了右边的null,于是就用匹配到的值null
console.log(om);//小王
console.log(mn);//中间人,右边为undefined,没有匹配到,使用默认值:‘中间人’

  下面我们再来一个比较复杂的,随便找的一个例子,我们可以看到:左边第一个冒号前面的root匹配到对象立马就赋值给了后面的{ leaf: { left } },然后这个对象的leaf属性匹配到的东西赋值给{leaf},最后也就是相当于{leaf} = {leaf:5,right:5},就是最简单的解构了。

 let tree = {
root: {
leaf: {
left: 5,
right: 5
}
}
}
let { root: { leaf: { left } } } = tree;
// console.log(root); //这一行注释放开的话报错,提示root is not defined
// console.log(leaf);//这一行注释放开的话报错,提示leaf is not defined
console.log(left);//5 这是可以取到值的,匹配成功

2.复杂一点的解构

  上面我说的是用一个表达式去匹配一个对象,那么问题来了,这个对象中可以有些什么形式呢?在1中我们的对象都是那种简单的对象{xx:'xx',xx2:'xxx'},那么这个对象可不可以是一个函数返回的对象呢?

  举个例子,我们发现这样也是可以的;

 function getPerson(na,num) {
return {
name: 'jack'+na,
age: 19+num
}
}
let { name, age } = getPerson('123',1);
console.log(name);//jack123
console.log(age);//20

  我又在想,既然类似let { name, age } = getPerson('123',1) 这种方式调用函数可以,那么继续变形一下,将getPerson(xxx)中的形参做一个变形,注意,我要变形了!w(°o°)w

 function getPerson({na,num}) {
return {
name: 'jack' + na,
age: 19 + num
}
}
//注意,这里我们调用函数传递的是一个对象,上面函数形参接收的也要是一个对象
let { name, age } = getPerson({na:'123',num:1});
console.log(name);//jack123
console.log(age);//

  发现还是可以,于是我又继续变形:

 function getPerson(obj){
return obj.commit("123",1);
}
//传递的对象更加复杂了
let obj = {
commit:(na, num)=>{
return {
name: 'jack' + na,
age: 19 + num }
}
}
//调用函数的参数还是一个对象,只不过更加复杂了,对象里面有一个commit属性,对应着一个函数
let { name, age } = getPerson(obj);
console.log(name);//jack123
console.log(age);//

  居然还可以,然后我又默默地做了一次变形:

 //注意这里形参,是一个{commit}对象
function getPerson({commit}){
return commit("123",1);
} //这里是实参,里面有一个commit属性,和上面的形参对应
let obj = {
commit:(na, num)=>{
return {
name: 'jack' + na,
age: 19 + num
}
}
} //在调用的函数的时候,传入实参obj,形参那里的{commit}就可以拿到对应的commit函数了
//这就是es6的解构,或者叫做析构
let { name, age } = getPerson(obj);
console.log(name);//jack123
console.log(age);//

  是不是有种日了狗一样的感觉,明明一个简单的东西为什么要弄的这么复杂呢?还有那个你为什么要在实参那里面还定义一个commit函数呢?简直坑爹!!

  然而用过vuex的人应该对这个commit很熟悉才对,类似下面代码所示,mutations就不贴出来了,怎么样,现在是不是觉得那个({commit},num)这种东西就亲切多了;

// 定义 actions ,要执行的动作,如流程的判断、异步请求
const actions ={
// {commit,state}外面还能自定义参数num,这个参数我们随便定义
increment({commit},num){
//提交一个名为 increment 的变化,名字可自定义,可以认为是类型名,与下方 mutations 中的 increment 对应
//简单的做个判断,如果自定义参会素是奇数,啥也不干
if(num%2 == 1) return;
//是偶数的话,commit 提交变化,修改数据的唯一方式就是显式的提交 mutations
commit('increment')
}
}

 

  顺便说一下,这里有个自定义参数的话,我们要传递参数的话,可以这样:

methods:{
//用这种三个点的写法也是es6中的,好像是叫做展开运算符,可以了解一下,用这种方式的话就可以使得mapActions这种东西和其他的方法例如incr函数,都可以放在methods里面
...mapActions([
//该 increment 来自 store.js 中导出的 actions 和 mutations 中的 increment
'increment'
]),
//incr这是自定义的一个点击事件函数
incr(){
//这里传递自定义参数1,随便定义
this.$store.dispatch('increment',1)
}
}

3.小小的总结

  还是那句话,我真的是太难了!妈耶,每次想学一点vue的时候,看到一些没见过的用法的时候,我就很头痛,其实如果真的要用的话,vuex很容易用,其实就是定义那三个东西,写法基本都是固定死的,然后在我们自己的组件中dispatcher调用就ok了,不过我个人习惯还是喜欢将一个不是很懂,或者是云里雾里的知识点给弄清楚来龙去脉;

  说实话,一直没怎么看es6的解构赋值,或者说是只是看了数组的解构,哈哈哈,就类似这种let [a, b, c] = [1,2,3],哈哈,最基本的用法,今天才无聊好好的看了一下,肯定还有很多用法每看到,下次有时间再说吧!

  还有在看这个解构赋值的时候,冒出一个想法,类似这种写法 let sum=(a,b)=>{return a+b};这是不是也可以看作是一种特殊的解构赋值呢?只不过由于返回的只有一个,所以就直接返回给sum,嘿嘿(^.^),到此结束

简单看看es6解构赋值的更多相关文章

  1. ES6解构赋值

    前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...

  2. ES6解构赋值的简单使用

    相较于常规的赋值方式,解构赋值最主要的是'解构'两个字,在赋值的过程中要清晰的知道等号右边的结构. 先简单地看一下原来的赋值方式. var a=[1,2] 分析一下这句代码的几个点: (1)变量申明和 ...

  3. ES6—解构赋值

    1.什么是解构赋值 ES6允许按照预定的模式,从数组.对象中提取值,对变量进行赋值. 我们直接用例子说明.    2. 数组的解构赋值 数组传统的变量赋值:      var arr=[1,2,3]; ...

  4. es6 解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值 ...

  5. (2)ES6解构赋值-数组篇

    1.解构赋值-数组篇 //Destrcturing(解构) //ES5 /* var a = 1; var b = 2; var c = 3; */ //ES6 var [a,b,c] = [1,2, ...

  6. es6 解构赋值 新认知/新习惯

    es6 的解构赋值其实很早就学习了,但一直纠结于习惯和可读性问题,所以没有大规模使用.最近被 react调教一番之后.已经完全融入认知和习惯中去了.总结一下三个常用的技巧: 对象取值 取值并重命名 剩 ...

  7. es6解构赋值总结

    数组的解构赋值 1.简单的赋值方式 2.多维数组解构赋值 3.默认值,只有当右边对应位置为undefined时候才会选择默认(null不属于undefined) 4.左右不对等,会相应的对号入座,没有 ...

  8. ES6解构赋值常见用法

    解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b 问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量 ...

  9. ES6 解构赋值详解

    解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...

随机推荐

  1. 从两个List集合里找到相同部分和不同部分

    /** * 获取两个集合里元素不同的部分 */ public List<User> getDifferent(List<User> u1, List<User> u ...

  2. python数据分析pandas中的DataFrame数据清洗

    pandas中的DataFrame中的空数据处理方法: 方法一:直接删除 1.查看行或列是否有空格(以下的df为DataFrame类型,axis=0,代表列,axis=1代表行,以下的返回值都是行或列 ...

  3. 使用three.js创建大小不随着场景变化的文字

    使用three.js创建大小不随着场景变化的文字,需要以下两步: 1.将文字绘制到画布上. 2.创建着色器材质,把文字放到三维场景中. 优点: 1.跟用html实现文字相比,这些文字可以被模型遮挡,更 ...

  4. oracle查询练习

    1成绩表score如下,查询出每门课都大于80分的学生姓名 准备数据 -建表- SQL> create table score(   2  name varchar(50),   3  kech ...

  5. 【JavaEE】之SSM-Maven依赖积累

    本帖中收集JavaEE SSM框架使用的Maven版本库中的依赖.本帖持续更新...... 日志输出: <dependency> <groupId>commons-loggin ...

  6. CSS3选择器归类整理

    CSS3选择器归类整理(附CSS优先级要点) CSS是用于网页设计可用的最强大的工具之一.使用它我们可以在几分钟内改变一个网站的界面,而不用改变页面的标签.在深入研究CSS选择器之前,我们应该先搞懂C ...

  7. Mysql密码忘记怎么修改?

    做开发的过程中多少会用到MySQL数据库,所以忘记密码也就成为一些马虎的同学的家常便饭了,今天发布一个忘记MySQL密码如何修改的文章作为记录. 1>首先将MySQL的服务关闭,两种方法:1,打 ...

  8. 第三章 学习Shader所需的数学基础(5)

    1. Unity Shader的内置变量(数学篇) 使用Unity写shader的一个好处在于,它提供了很多内置参数,这使得我们不在需要自己手动算一些值.本文给出Unity内置的用于空间变换和摄像机以 ...

  9. C# 中的委托和事件(一)

    引言 委 托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有 ...

  10. 17.JAVA-Dom、Sax解析XML详解

    在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...