简单看看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);//20

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

 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);//20

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

 //注意这里形参,是一个{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);//20

  是不是有种日了狗一样的感觉,明明一个简单的东西为什么要弄的这么复杂呢?还有那个你为什么要在实参那里面还定义一个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,嘿嘿(^.^),到此结束

原文地址:https://www.cnblogs.com/wyq1995/p/12008138.html

时间: 2024-11-09 02:38:54

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

ES6解构赋值

前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 引入 在ES5中,开发者们为了从对象和数组中获取特定数据并赋值给变量,编写了许多看起来同质化的代码 let options = { repeat: true, save: false }; // 从对象中提取数据 let repeat = options.repeat, save = option

ES6 解构赋值用途

1.交换变量的值2.从函数返回多个值3.函数参数的定义4.提取json数据5.函数参数的默认值6.遍历Map结构7.输入模块的指定方法   1.交换变量的值 // es5 console.log("es5"); var a = 100; var b = 200; var temp; temp = a; a = b; b = temp; console.log(a, b) // es6 console.log("es6") var x = 1000, y = 2000

js es6 解构赋值

解构赋值:es6允许按照一定的模式,从数组或对象中提取值 let [a,b,c] = [1,2,3]; let {a,b}= {a:1,b:2}; 对象 let {a,b}= {b:1,a:2} //输出2,1,即找属性名,不管什么位置 数组例子1:(完全解构) let [a,b,c] = [1,2,3]; console.log(a)//1 console.log(b)//2 console.log(c)//3 例子2:(不完全解构) let [a,[b],c] = [1,[2,3],func

260 ES6解构赋值

ES6中允许从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构.[解构:分解数据结构.] 解构赋值就是把数据结构分解,然后给变量进行赋值 如果解构不成功,变量跟数值个数不匹配的时候,变量的值为undefined 数组解构用中括号包裹,多个变量用逗号隔开,对象解构用花括号包裹,多个变量用逗号隔开 利用解构赋值能够让我们方便的去取对象中的属性跟方法 数组解构 如果解构不成功,变量的值为undefined let ary = [1, 2, 3]; let [a, b, c, d, e] =

(5)ES6解构赋值-函数篇

函数参数的解构赋值 function sum(x, y) { return x + y; } sum(1,2);//3 //解构赋值 function sum([x, y]) { return x + y; } console.log( sum([1,2]) );//3 函数参数解构赋值的默认值 function fun({x = 0, y = 0} = {}) { return [x, y]; } console.log( fun({}) ); //[0,0] console.log( fun

es6解构赋值的几个用法

1.解构赋值可以轻松获取对象或者数组中的数据 var jsonData = { data: "111", data2: ["test","test2"], }; 结果: json中的数据就被轻松获取: 2.解构复制可以交换变量 var a=1,b=2,c=3,d=4; [a,b,c,d]=[d,c,b,a]; console.log(a,b,c,d); 结果: a=4,b=3,c=2,d=1 赋值的过程需要保证两边的数据格式匹配 [a,b,c,d

【vue】es6 解构赋值--函数参数解构赋值

函数的参数也可以使用解构赋值. function add([x, y]){ return x + y; } add([1, 2]); // 3 上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y.对于函数内部的代码来说,它们能感受到的参数就是x和y. [[1, 2], [3, 4]].map(([a, b]) => a + b); 默认值 function move({x = 0, y = 0} = {}) { return [x, y]; } mo

ES6——解构赋值

解构赋值: 注意: 1.左右两边结构必须一样 练习1,2,3 2.右边必须是个东西(有值)练习4 3.声明和赋值不能分开(必须在一句话里完成)练习5 /* 练习1: // let arr = [1,2,3]; // let a = arr[0]; // let b = arr[1]; // let c = arr[2]; // console.log(a,b,c); // 输出:1 2 3 //解构赋值 let [a,b,c] = [1,2,3]; console.log(a,b,c); //

es6变量解构赋值的用途

这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x,y]=[1,2]; [x,y]=[y,x]; console.log(x);//输出2 console.log(y);//输出1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里面返回.有了解构赋值,取出这些值那是非常的方便,最关键是易读 function