Skip to content

Latest commit

 

History

History
113 lines (83 loc) · 2.56 KB

variable.md

File metadata and controls

113 lines (83 loc) · 2.56 KB

数组

变量解构赋值

//eg
//从数组中提取值,按照对应位置,对变量赋值

let [a,b,c] = [a,b,c];


//各种结构嵌套只要格式一致,还是可以解构相应的值
let [a,[b],[c]] = [1,[2],[3]];

let [ , , a] = [1,2,3];

let [a, ,c]  = [1, ,3];

let [a,...b] = [1,2,3,4,5,6]; 	//b=[2,3,4,5,6]

let [a,b,...c]  = [1]; // a = 1; b = undefined; c=[]

解构失败

let [a] = [];		//undefined
let [a,b] = [1];	//b:undefined

//解构失败的值是undefined

部分解构

右边的值大于等于左边的值(即右边的值包含左边的值)

//部分结构
let [a,b,c] = [1,2,3,4,5,6];

//右边是不是可遍历的结构会报错
let [a] = null;
let [a] = false;
let [a] = {};
let [a] = NAN;
let [a] = 7;

赋值->默认值

let [a = true] = []; //a = true

let [a = 1] = [null]; // a = null,默认值会失效,因为null === undefined 不成立

惰性求值

function b(){...}
let [a = a()] = [1];
//默认值如果是表达式,会先计算右侧是否有值,如果有直接用右侧的值,如果右侧的值是undefined,才会执行b()

默认值可以引用解构赋值的其他变量,但该变量必须已经声明。

let [x = 1 ; y = x] = []; //1,1
let [x = 1 ; y = x] = [2]; //2,2 右侧的值会覆盖默认值
let [x = y ; y = 1] = [];  //报错

对象

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

let {a,b} = {a:1,b:2};

//如果变量名和右侧的属性名不一样,需要写成如下格式
let {testa : testb} = {testa : 'testa'};	
testb // 'testa'
//内部的赋值机制如下
let {a:a,b:b} = {a:1,b:2};

//对象的嵌套解构
var node = {
	p : [
		'hello',
		{y : 'world'}
	]
};	
let { p : [x,{y}]} = node;
x;	//hello
y;	//world
	//p是模式,不是变量,不会被赋值

字符串,布尔值,函数参数都可以解构赋值

用途

1.交换变量的值
let x = 1;
let y = 1;
[x,y] = [y,x];
2.函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

//返回数组
function test(){
	return [1,2,3];
}
let [a,b,c] = test();

//返回对象
function obj (){
	return {
		a : 1,
		b : 2
	}
}
let {a,b} = obj();
3.提取json字段
let json = {
	a : 2,
	b : 'bbb',
	c : [1,2,3,4]
};
let {a,b,c} = json;