ECMAScript6变量的解构赋值

210 阅读3分钟

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)

###数组的解构赋值

//ES5
//var a = 1;
//var b = 2;
//var c = 3;
	
//ES6
var [a,b,c] = [1,2,3];
console.log(a,b,c);//1,2,3
  • 不完全解构

等号左边的模式,只匹配一部分的等候右边的数组

let [x,y] = [1,2,3];
console.log(x,y);//1,2
	
	
let [a,[b],c] = [1,[2,3],4];
console.log(a,b,c); //1,2,4
  • 指定默认值

注意:ES6内部使用严格相等运算符(===)判断一个位置是否有值。所以如果一个数组成员不严格等于undefined,默认值是不会生效的

var [temp = 'string'] = [];
console.log(temp); //string
	
var [temp = 'string'] = ['tempString'];
console.log(temp); //tempString
  • let和const命令

只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值.

###对象的解构赋值

  • 解构赋值也可以用于对象

    对象的属性没有次序,变量必须与属性同名,才能取到正确的值

var {name,age,id} = {id:'007',name:'Lily',age:'22'};
console.log(name,age,id); //Liyl,22,007
变量名与属性名不一致
var {person_name,person_age,person_id} = {id:'007',name:'Lily',age:'22'};
console.log(name,age,id); //undefined, undefined, undefined
		
		
//正确处理	
var {name:person_name,age:person_age,id:person_id} = {id:'007',name:'Lily',age:'22'};
console.log(person_name,person_age,person_id);//Liyl,22,007
		
let object = {first:'hello',last:'word'};
let {first:firstName,last:lastName} = object;
console.log(firstName,lastName);//hello word
  • 指定默认值

    默认值生效的条件是,对象的属性值严格等于undefined

var {x = 3 } = {};
console.log(x);//3
		
var {x,y = 5} = {x:1};
console.log(x,y);//1,5
  • 现有对象的方法

    对象的解构赋值,可以很方便的将现有对象的方法,赋值到某个变量

//ES5
console.log(Math.sin(Math.PI/4));// 0.7071067811865475

let {sin,cos,tan} = Math;
console.log(sin(Math.PI/4)); //0.7071067811865475

###字符串的解构赋值

  • 字符串也可以解构赋值

    字符串会被转换成类似数组的对象。

const [a,b,c,d,f] = 'hello';
console.log(a); //h
console.log(b); //e
console.log(c); //l
console.log(d); //l
console.log(f); //o
  • 属性解构赋值

    类似数组的对象都有length属性,因此还可以对这个属性进行解构赋值。

const {length:len} = 'hello';
console.log(len);//5

###函数参数的解构赋值

  • 函数的参数也可以解构
function sum([x,y]) {
	return x+y;
}
console.log(sum([1,2])); //3
  • 函数的参数的解构也可以使用默认值
function test({x = 0,y = 1} = {}) {
	return x + y;
}
console.log(test({x:100}),test({x:100,y:100}));//101,200

###结构赋值的用途

  • 交换变量的值
	
console.log('ES5');

var a = 100;
var b = 200;

console.log('交换前');
console.log('a='+ a);//100
console.log('b='+ b);//200

var temp;

temp = a;
a = b;
b = temp;

console.log('交换后');
console.log('a=' + a);//200
console.log('b=' + b);//100

//~~~~~~~~~~~~~~~~~~~ES6~~~~~~~~~~~~~~~~~~~~~
console.log('ES6');

var a = 100;
var b = 200;

console.log('交换前');
console.log('a='+ a);//100
console.log('b='+ b);//200

[a,b] = [b,a];

console.log('交换后');
console.log('a=' + a);//200
console.log('b=' + b);//100
	
  • 从函数返回多个值

function fun() {

	return [1,2,3];
}

var [x,y,z] = fun();

console.log(x,y,z);//1,2,3

  • 提取Jason数据
var jasonData = {

   id:"007",
   name:'lily',
   age:28,
   score:{
     	chinese:98,
       english:100
   }
};
console.log(jasonData);

//ES5
console.log(jasonData.age);
console.log(jasonData.name);
console.log(jasonData.id);
console.log(jasonData.score.chinese);
console.log(jasonData.score.english);

//ES6
let {id,name,age,score} = jasonData;

console.log(id);
console.log(name);
console.log(age);
console.log(score.chinese);
console.log(score.english);

  • 遍历Map结构
var map = new Map;
map.set('id','007');
map.set('name','Lily');
console.log(map);
console.log(typeof(map));

//获取键值对
for (let [key,value] of map){

    console.log(key + value);
}

//获取建
for(let [key] of map){

    console.log(key);
}

//获取值

for (let [,value] of map){

    console.log(value);
}
  • 输入模块的指定方法

.etc