简单看看es6解构赋值
哎,我真的是太难了,今天就被这个解构赋值(也可以叫做析构,貌似析构是在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解构赋值的更多相关文章
- ES6解构赋值
前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...
- ES6解构赋值的简单使用
相较于常规的赋值方式,解构赋值最主要的是'解构'两个字,在赋值的过程中要清晰的知道等号右边的结构. 先简单地看一下原来的赋值方式. var a=[1,2] 分析一下这句代码的几个点: (1)变量申明和 ...
- ES6—解构赋值
1.什么是解构赋值 ES6允许按照预定的模式,从数组.对象中提取值,对变量进行赋值. 我们直接用例子说明. 2. 数组的解构赋值 数组传统的变量赋值: var arr=[1,2,3]; ...
- es6 解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值 ...
- (2)ES6解构赋值-数组篇
1.解构赋值-数组篇 //Destrcturing(解构) //ES5 /* var a = 1; var b = 2; var c = 3; */ //ES6 var [a,b,c] = [1,2, ...
- es6 解构赋值 新认知/新习惯
es6 的解构赋值其实很早就学习了,但一直纠结于习惯和可读性问题,所以没有大规模使用.最近被 react调教一番之后.已经完全融入认知和习惯中去了.总结一下三个常用的技巧: 对象取值 取值并重命名 剩 ...
- es6解构赋值总结
数组的解构赋值 1.简单的赋值方式 2.多维数组解构赋值 3.默认值,只有当右边对应位置为undefined时候才会选择默认(null不属于undefined) 4.左右不对等,会相应的对号入座,没有 ...
- ES6解构赋值常见用法
解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b 问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量 ...
- ES6 解构赋值详解
解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...
随机推荐
- linux下的du和df的区别
du(disk usage)是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的.他计算的大小就是当前他认为存在的所有文件大小的累加和. df(disk fre ...
- Git实战指南----跟着haibiscuit学Git(第一篇)
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
- javascript实用Date工具
时间字符串和年月日数据之间的自由转换工具:2018年更新版 上代码: /** * @Desc: 时间处理工具 * @Author: 拿饭盒当烟灰缸 * @Date: 2018-02-27 15:42: ...
- 【Python成长之路】装逼的一行代码:快速共享文件【华为云分享】
[写在前面] 有时候会与同事共享文件,正常人的操作是鼠标右键,点击共享.其实有个装逼的方法,用python的一行代码快速实现基于http服务的共享方式. [效果如下] [示例代码] 在cmd窗口进入想 ...
- 这可能是最容易入门的socket教程了
前言: 如今,网络编程已然成为了一个后端开发工程师需要具备的核心技能之一.因此,该博客力求提供最简单.通俗的描述方式,来描绘网络编程中常见的知识点,同时附带代码示例,后期会加上具体的抓包分析,实际项目 ...
- luogu P5414 [YNOI2019]排序 |动态规划
题目描述 对于一个数列{7, 1, 2, 3}进行排序,我们可以把7 从头移动到尾.但是这个操作的成本是7,并不是最佳的.最佳的排序方式是将连续的1.2.3 移动到7 的前面.这样的话,总的操作成本就 ...
- CocoaPods 详解之----更新篇
CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率越来越高,几乎已是所有 Cocoa 开源项目的标配.另外,很多大点的团 ...
- [TimLinux] Django 中间件
1. 定义 中间件是一个钩子框架,深入到django的请求/响应处理过程中.这是一个轻量.底层插件系统,目的是全局修改django的输入或输出.每一个中间件组件都是用来处理特定的功能.例如django ...
- Codeves-5037线段树4加强版(线段树? 。。。分块)
维护一个序列,要求支持下列2种操作: add a b c:区间[a,b]中每个数加上c count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数) 输入描述 Input Descrip ...
- Typora常见的快捷方式
操作类型 操作 快捷键 文件操作 新建 Ctrl + N 新建窗口 Ctrl + Shift + N 打开 Ctrl + O 快速打开 Ctrl + P 保存 Ctrl + S ...