数组的结构赋值
一、简单的解构赋值:<br><br>const arr = [1,2,3,4];<br><br>let [a,b,c,d]= arr;<br><br>我的理解就是,数组的解构赋值是提供已知数据的数组a,赋值给相同结构、内容为变量的数组b,这样一次性的把b都给赋值了。
二、更复杂的匹配规则:<br><br>const arr = ['a','b',['c','d',['e','f','g']]];<br><br>const [ , ,[ , ,[ , ,g]]]=arr;<br><br>这样的话,就是变量g只取数组arr中的'g',但是变量g所在的数组的结构要和数组arr匹配,逗号不能少;
三、扩展运算符:<br><br>const arr1 = [1,2,3];<br><br>const arr2 = ['a','b'];<br><br>const arr3 = ['zz',1];<br><br>const arr4 = [...arr1, ...arr2, ...arr3];<br><br>如果arr4中不加... ,那么数组arr4中显示的就是[Arr1,Arr2,Arr3],如果加上... ,那么arr4中显示的就是一个数组,这个数组是前三个数组的集合[1, 2, 3, "a", "b", "zz", 1]。
结合扩展运算符和结构赋值<br><br>const arr = [1,2,3,4,5,6];<br><br>const [a,b,...c] = arr;<br><br>这样,c的结果就是[3, 4, 5, 6],c就是取除了a,b后面所有的值;但是扩展运算符和数组的结构赋值结合的话,数组变量中,扩展运算符只可以放在最后,后面 不可以有变量([a,b,...c,d]这样就是错的)。
四、默认值<br><br>数组的解构赋值,变量的默认值是undefined<br><br>const arr = [1,undefined,undefined];<br><br>const [a,b,c,d] = arr;<br><br>b、c被赋值给了undefined,d的话,在arr中没有被匹配到,取的是默认值,是undefined;因为const常量被声明的时候必须被赋值,这样写没有报错,说明直接给了默认值;
如果匹配的的数组值是undefined,被匹配的数组,常量中若有给值的话,那么就取用给的值,b为2,c为undefined,d为aaa,也即只有数组是undefined的时候,才可以匹配被给的数值;<br><br>但如果arr中给的是null,那么即使被匹配常量中有值的话,也不会取值<br><br>(比如const arr=[1,null,undefined] ;<br><br>const [a,b=2,c,d='aaa'] = arr;这样b还是不等于2,b被取值为null)。
五、交换变量<br><br>ES6之前,交换变量的方法是给创建一个新的变量,然后进行交换;<br><br>利用解构赋值交换会很方便:<br><br>let a = 20;<br><br>let b = 10;<br><br>[a,b] = [b,a];
六、接收多个 函数返回值<br><br>function getUserInfo(id){<br><br>return [<br><br>true,<br><br>{<br><br>name:'小明',<br><br>gender:'女',<br><br>id:'id'<br><br>},<br><br>'请求成功'<br><br>];<br><br>};<br><br>const [status,data,msg] = getUserInfo(123);<br><br>因为这样函数执行后返回的是一个数组(数组中是一个布尔值,一个对象,一个字符串),这样就可以用到解构赋值了,赋值给三个常量;<br><br>之前的做法是将函数的执行赋值给一个变量a(或者常量),然后通过变量a[i]赋值给各个变量b(或常量),打印变量b的时候就可以看到各个函数的返回值。
对象的解构赋值
1.数组与对象区别<br><br>数组有序,根据下标取值;<br><br>对象是无序的,结构赋值时,变量名和对象的属性名相同,就可以匹配,取到对象中属性的属性值; <br>
2.无需保留前项位置,即使用逗号;
3.赋值对象匹配---如图<br>当对象为中其中一个属性为数组时,则需按照数组方式来解析结构,另当前者为数组的同时,里面的数组项为对象时,获取相同的属性名,则不能写相同的属性名(const 申明的变量名不能重名)---------用:隔开,只可前者属性名相同,同时将属性值赋予;后者则是需要属性名:属性值(变量名称),是将其属性名的属性值赋予变量<br>*****对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量,
要拿某个属性只要构造相同的数据结构就行,属性重名时可以在属性后加个:,形成A:B,表示拿A的属性但是复制给B
4.扩展运算符...<br><br>1)可通过扩展运算符,匹配后面所有的属性<br><br>const obj = {<br><br>saber:'阿尔托利亚',<br><br>archer:'卫宫',<br><br>lancer:'瑟坦达'<br><br>};<br><br>const{saber,...oth }= obj;----表示将将剩下的两项以oth为名的对象;<br><br>同样扩展运算符不能在中间,只能在末尾<br><br><br>
2)...扩展运算符也可使用,独享合并<br><br>const obj1 = {<br><br>archer:'卫宫',<br><br>lancer:'瑟坦达'<br><br>}<br><br>const obj = {<br><br>saber:'阿尔托利亚',<br><br>...obj1<br><br>};-----将obj1的属性合病到obj
5.默认值<br><br>与数组相似,当匹配到undefind,就会取默认值;<br><br>let girlfriend = {<br><br>name:'小红',<br><br>age:undefind,<br><br>};<br><br>let {name ,age = 24, hobby = ['学习'] } = girlfriend;----age则为默认值24岁,当不是时,则匹配到属性值;
字符串的解构赋值
1.通过数组形式来匹配字符串;
2.扩展运算符...<br><br>...oth 是将剩下的字符串的字母以数组的形式全部拆分为25个字母,而非单词;
3.图中的三种方式都是如第2点所诉,以数组的形式全部拆分为单独字母,而非单词;
1.关于oth,把剩下的以数组的形式赋值给oth<br><br>2.切割字符串的三种方式<br><br>const [...spStr1] = str;<br><br>const spStr2 = str.spilt('');<br><br>const spStr3 = [...str];<br><br>3.提取属性<br><br>const {length}=str
数值与布尔值的解构赋值
1.当str(字符串).length时,是将字符串临时包装成对象获取,获取完后,又重新返回str;