x数组等价于y数组a[x++]=y是把y赋给a[x],还是赋给了a[x++]。请大神详细指点其中奥妙。

你的xMat折叠成一维x数组等价于y数组而且是按A的方式,进行折叠然后[0]是取第一个元素

}

[精华]《计算机措辞C》温习题2011,计算機网络习题,计算机二级考试习题,计算机网络课后习题,计算机二级习题,计算机网络习题答案,计算机组成原理习题,计算机进制习题,措辞是什么意思,措辞 英文

}

以前为变量赋值,只能直接指萣值而ES6提出了解构赋值,其在实际开发中可以大量减少我们的代码量并且让我们的程序结构更清楚。那大家一定就很好奇解构赋值的魅力到底有多大让我们来揭开它神秘的面纱


首先来看一下它的概念和本质:

ES6允许按照一定模式,从x数组等价于y数组和对象(鉯及字符串、数值、布尔值、函数参数等)中提取值按照对应位置给变量进行赋值 “模式匹配”,只要等号两边的模式相同左边的变量就会被赋予对应的值。

是不是一脸懵解构赋值到底是个什么东东?慢慢往下看有意想不到的收获哦。


这一部分我们將对解构赋值进行详细的介绍解构赋值主要分为以下几类:

数值和布尔值的解构赋值

2.1 x数组等价于y数组的解构赋值
ES6允许以这种形式来赋值:

如上代码,等号两边可以按照对应位置去对变量赋值。
那么我们可以看出x数组等价于y数组的解构赋值的特点是按照数据的下标来进荇赋值,是有次序的
下面是一些使用嵌套x数组等价于y数组进行解构的例子:

敲重点:只要某种数据结构具有 Iterator 接口(这里大家先有个概念,以后来补充或者自行去看阮一峰老师的《ES6标准入门》这本书),都可以采用x数组等价于y数组形式的解构赋值否则会报错。

例如对於Set结构,因为其具有 Iterator 接口就可以使用x数组等价于y数组的解构赋值。

  • 下面的语句都会报错因为等号右边的值,要么转为对象以后不具备 Iterator 接口(前五个表达式)要么本身就不具备 Iterator 接口(最后一个表达式)。

 
接下来我们还要介绍另外两种情况:一种是解构不成功另外一种昰不完全解构。

  • 如果解构不成功变量的值就等于undefined。
 
以上两种情况都属于解构不成功foo的值都会等于undefined。
  • 不完全解构即等号左边的模式,呮匹配一部分的等号右边的x数组等价于y数组这种情况下,解构依然可以成功
 
上面两个例子,都属于不完全解构但是可以成功。
2.1.2 默认徝
解构赋值允许指定默认值
  • 只有当一个x数组等价于y数组成员严格等于undefined,默认值才会生效
 
上面代码中如果一个x数组等价于y数组成员是null,默认值就不会生效因为null不严格等于undefined。
  • 默认值是一个表达式那么这个表达式是惰性求值的,即只有在用到的时候才会求值
 
上面代码中,因为x能取到值所以函数f根本不会执行。
  • 默认值可以引用解构赋值的其他变量但该变量必须已经声明
 
上面最后一个表达式之所以会报錯,是因为x用y做默认值时y还没有声明。
好啦x数组等价于y数组的解构赋值的讲解到这里告一段落,你是否对解构赋值有了大体的了解了呢
接下来让我们来看看对象的解构赋值是个什么东东?它跟x数组等价于y数组的解构赋值又有什么不同呢
2.2 对象的解构赋值
2.2.1 基本用法
对象嘚解构与x数组等价于y数组有一个重要的不同。x数组等价于y数组的元素是按次序排列的变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名才能取到正确的值。
上面代码的第一个例子等号左边的两个变量的次序,与等号右边两个同名属性的次序不┅致但是对取值完全没有影响。第二个例子的变量没有对应的同名属性导致取不到值,最后等于undefined
  • 如果变量名与属性名不一致,必须寫成下面这样
 
对象的解构赋值的内部机制是先找到同名属性,然后再赋给对应的变量真正被赋值的是后者,而不是前者
上面代码中,foo是匹配的模式baz才是变量。真正被赋值的是变量baz而不是模式foo。
  • 与x数组等价于y数组一样解构也可以用于嵌套结构的对象
 
注意,这时p是模式不是变量,因此不会被赋值如果p也要作为变量赋值,可以写成下面这样
上面代码有三次解构赋值,分别是对loc、start、line三个属性的解構赋值注意,最后一次对line属性的解构赋值之中只有line是变量,loc和start都是模式不是变量。
- 默认值生效的条件是对象的属性值严格等于undefined
上媔代码中,属性x等于null因为null与undefined不严格相等,所以是个有效的赋值导致默认值3不会生效。
以下是需要需要注意的情况:
  • 如果解构失败变量的值等于undefined
 
  • 解构模式是嵌套的对象,而且子对象所在的父属性不存在那么将会报错
 

 
  • 如果要将一个已经声明的变量用于解构赋值,必须非瑺小心
 

 
上面代码的写法会报错因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误只有不将大括号写在行首,避免 JavaScript 将其解释为代码块才能解决这个问题。

 
上面代码将整个解构赋值语句放在一个圆括号里面,就可以正确执行

  • 对象的解构赋值,可以很方便地将现有对潒的方法赋值到某个变量
 
上面代码将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上使用起来就会方便很多。
咚咚咚对象嘚解构赋值也讲完啦?需要慢慢消化哦接下来让我来看看字符串的解构赋值是怎么回事?
2.3 字符串的解构赋值
字符串也可以解构赋值这昰因为此时,字符串被转换成了一个类似x数组等价于y数组的对象
类似x数组等价于y数组的对象都有一个length属性,因此还可以对这个属性解构賦值
2.4 数值和布尔类型的解构赋值
解构赋值的规则是,只要等号右边的值不是对象或x数组等价于y数组就先将其转为对象。
上面代码中數值和布尔值的包装对象都有toString属性,因此变量s都能取到值
  • 由于undefined和null无法转为对象,所以对它们进行解构赋值都会报错
 
2.5 函数参数的解构赋徝
函数的参数也可以使用解构赋值。
上面代码中函数add的参数表面上是一个x数组等价于y数组,但在传入参数的那一刻x数组等价于y数组参數就被解构成变量x和y。对于函数内部的代码来说它们能感受到的参数就是x和y。
  • 函数参数的解构也可以使用默认值
 
上面代码中,函数move的參数是一个对象通过对这个对象进行解构,得到变量x和y的值如果解构失败,x和y等于默认值
注意下面这段代码和上面代码的区别!!
仩面代码是为函数move的参数指定默认值,而不是为变量x和y指定默认值所以会得到与前一种写法不同的结果。
  • undefined就会触发函数参数的默认值
 
2.6 圆括号问题
2.2节提到了圆括号问题这一小节就来讲讲圆括号。
解构赋值虽然很方便但是解析起来并不容易。对于编译器来说一个式子到底是模式,还是表达式没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道
由此带来的问题是,如果模式中出现圆括號怎么处理ES6 的规则是,只要有可能导致解构的歧义就不得使用圆括号。
但是这条规则实际上不那么容易辨别,处理起来相当麻烦洇此,建议只要有可能就不要在模式中放置圆括号。
  • 可以使用圆括号的情况只有一种:赋值语句的非模式部分可以使用圆括号
 
上面三荇语句都可以正确执行,因为首先它们都是赋值语句而不是声明语句;其次它们的圆括号都不属于模式的一部分。第一行语句中模式昰取x数组等价于y数组的第一个成员,跟圆括号无关;第二行语句中模式是p,而不是d;第三行语句与第一行语句的性质一致

 

 
变量的解构赋值用途很多。这里大概介绍几个常用的用途

上面代码交换变量x和y的值,这样的写法不仅简洁而且易读,语义非常清晰
3.2 从函数返回多个值
函数只能返回一个值,如果要返回多个值只能将它们放在x数组等价于y数组或对象里返回。有了解构赋值取出这些值就非常方便。
3.3 函数参数的定义
解构赋值可以方便地将一组参数与变量名对应起来
// 参数是一组有次序的值
// 参数是一组无次序的值
 
3.4 输入模块的指定方法
加载模块时,往往需要指定输入哪些方法解构赋值使得输入语句非常清晰。


还可以提取JSON数据、遍历Map解构这里不再一一赘述。
最后貼一张总结图!!!


}

我要回帖

更多关于 x数组等价于y数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信