最近在看阮大神的ECMAScript6入门教程,对象解构有这样两个例子
看着很懵逼啊,先进行一点知识的储备
首先明确一个内容
var {foo} = {foo:2}
foo //2
这一行是怎么赋值的呢,首先等号前的对象{foo},其实是{foo:foo},前面是属性名,后面是变量foo,解构赋值时是先查找相同的属性名foo,将相同属性名的属性值2赋值给变量foo
var{x=3}={};
x //3 先进行解构赋值,没有相同属性名x,所以变量x使用默认的值3
var {x=3}={x:1}
x //1 先进行解构赋值,查找相同属性名x,将1赋值给变量x,因为x的值不为undefined,所以忽略默认值
var{x=3}={x:undefined};
x //3 先进行解构赋值,查找相同属性名x,将undefined赋值给变量x,因为x的值为undefined,所以使用默认值3
接下来,返回上面的两个例子
上述的函数move的参数是对象{x=0,y=0},参数对象中的属性x,y的属性值x,y有默认值为0,0,而且参数对象有默认值{}
move({x:3,y:8}); //[3,8] 首先传入参数对象{x:3,y:8},因为传入了参数对象,所以忽略惰性赋值的默认值{},然后参数对象中变量x,y传值不为undefined,所以忽略x,y默认的值0,0
move({x:3}) //[3,0] 首先传入参数对象{x:3},所以忽略函数参数的默认值{},x传值为3,不为undefined,忽略默认值0,y没有传值,所以y为undefined,使用默认值0
move({}) //[0,0] 首先传入参数对象{},因为传入了对象,只是没有属性,所以忽略了函数参数的默认值{},x,y没有传值,所以x,y为undefined,使用默认值0,0
move() // [0,0] 没有传入对象,所以使用函数参数默认值{},但是函数默认值也没有赋值,x,y还是undefined,所以使用默认值0,0 如果函数参数的默认值不为{},则答案会是默认值解构赋值的值
上述的函数move的参数是对象{x,y},参数对象中的属性x,y的属性值x,y没有默认值,但是参数对象有默认值{x:0,y:0}
move({x:3,y:8}); //[3,8] 首先传入参数对象{x:3,y:8},因为传入了参数对象,所以忽略惰性赋值的默认值{x:0,y:0},然后参数对象中变量x,y传值位3,8
move({x:3}) //[3,undefined] 首先传入参数对象{x:3},所以忽略函数参数的默认值{x:0,y:0},x传值为3,y没有传值,所以y为undefined
move({}) //[undefined,undefined] 首先传入参数对象{},因为传入了对象,只是没有属性,所以忽略了函数参数的默认值{x:0,y:0},x,y没有传值,所以x,y为undefined
move() // [0,0] 没有传入对象,所以使用函数参数默认值{x:0,y:0},所以变量x,y传值为0,0