其他的解构赋值
字符串的解构赋值
字符串也可以结构赋值,此时字符串被转换成了一个类数组对象。
类数组对象都有length属性,因此还可以对这个属性解构赋值。
数值与布尔值的解构赋值
解构赋值时,如果等号右边是数值或者布尔值,则会先转为对象。
12345let {toString: s} = 123s === Number.prototype.toString // truelet {toString: s} = trues === Boolean.prototype.toString //true解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对像,由于undefined和null无法转为对象,所以对他们进行解构赋值赋值都会报错。
函数参数的解构赋值
函数参数的解构赋值
12345678910111213function add([x,y]){return x + y}add(1,2)//3```2. add的参数实际上不是一个数组,而是通过解构得到的变量x,y3. 函数参数的解构也可以使用默认值。```javascriptfunction move({x=0,y=0} = {}){ return [x,y]}move({x:3,y:8})//[3,8]move({y:8})//[0,8]move()//[0,0]move({})//[0,0]默认值的变型
1234567function move({x,y}={x:0,y:0}){return [x,y]}move({x:3,y:8})//[3,8]move({x:3})//[3,undefined]move({})//[undefined,undefined]move()//[0,0]上面的代码是为函数move的参数指定默认值,而不是为了变量x,y指定默认值,所以会得与前一种写法不同的结果。
undefined会出发函数参数的默认值
12[1,undefined,3].map((x = 'yes')=>x)//[1,'yes',3]
关于圆括号!
上节我们说了,圆括号是为了解决对象解构赋值的时候,花括号存在于行首这样的情况出现。
那么什么时候我们是不能使用圆括号呢??
变量声明语句中,模式不能使用圆括号
123let [(a)] = [1]let {x:(c)} = {}let {o:(p:p)} = {o:{p:2}}//全部报错函数参数重,模式不能带有圆括号
1function f([(z)]){ return z}//报错不能将整个模式或嵌套模式中的一层放入圆括号里
12({p:a}) = {p:42}([a]) = [5]//全部报错
可以使用圆括号的情况
可以使用圆括号的情况只有一种:赋值语句的非模式部分可以使用圆括号
解释:1.他们都是赋值语句,而不是声明语句
2.他们的圆括号都不属于模式的一部分
解构赋值的用途
变换变量的值
1[x,y] = [y,x]从函数返回多个值
1234567function exmple(){return [1,2,3]}let [a,b,c] = exmple()a//1b//2c//312345function exmple(){return {foo:1,bar:2}}let {foo,bar} = exmple()//{foo:1,bar:2}函数参数的定义
结构赋值可以方便的将一组参数与变量名对应起来有序值
123function f([x,y,z]){ ... }f([1,2,3])//x:1,y:2,z:3无序值
123function f({x,y,z}){ ... }f({x:1,z:3,y:2})//{x:1,y:2,z:3}
提取Json数据
解构赋值对提取Json対值中的数据尤其有用。123456789var jsonData = {id: 42,status: 'ok',data: [867,5309]}var {id,status,data:number} = jsonDataconsole.log(id,status,number)//42,'ok',[867,5309]函数参数的默认值
1234567891011jQuery.ajax = function(url,{async = true,beforesend = function(){ ... },cache = true,complete = function(){ ... },crossDomain = false,global = true,//...more config}){//do stuff}
指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || default.foo
这样的语句。
6.遍历Map的结构
Map结构原生支持Iterator接口,配合变量的结构赋值,获取键名和键值就非常方便。
|
|
如果只是想获取键名或者键值的话,可以写成下面那样。
//获取键名
//获取键值
- 输入模块的指定方法
加载模块时,往往需要指定输入那些方法,解构赋值是得输入语句非常清晰1const { SourceMapConsumer,SourceNode } = require('source-map')