ES6之变量的解构赋值(笔记)

ES6之变量的解构赋值(笔记)

1、数组的结构赋值

  • 解构:按照一定模式从数组和对象中提取值,对变量进行赋值。
    如:
var [a,b,c]=[1,2,3];
a //1
b //2
c //3

let [x,y,...z] = ['a'];
x //"a"
y //undefined,解构不成功返回undefined
z //[]
如果等号右边不是数组则会报错(不可遍历结构)

如:

let [foo] = 1;
let [foo] = false;
let [foo] = {
    
    };
//都会报错!
因为等号右边的值,要么转为对象以后不具备Iterator接口(前五个表达式),事实上只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
  • 不完全解构:即等号左边的模式,只匹配一部分的等号右边的数组。
let [x,y] = [1,2,3];
x // 1
y // 2 
  • ***默认值:***解构赋值允许指定默认值。

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

2、对象的解构赋值

  • 与数组解构的不同点: 数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,== 变量必须与属性同名==,才能取到正确的值。
var {
    
     bar,foo} = {
    
     foo:"aa",bar:"bb"};
bar // "bb"
foo // "aa"
var {
    
     baz} = {
    
     foo:"aa",bar:"bb"};
baz // undefined (baz没有对应同名的变量,所以取不到值)
  • 内部机制: 先找到同名属性,然后再赋值给对应的变量。真正被赋值的是后者不是前者。
var {
    
    foo:baz} = {
    
    foo:"aa",bar:"bb"};
baz // "aa" (真正被赋值的是变量 baz ,而不是模式 foo 。)
  • 可指定默认值: 生效的条件为对象的属性值严格等于 undefined

3、字符串的结构赋值

字符串也可解构是因为此时,字符串被换成了一个类似数组的对象。类似数组对象有 length 属性

const [a,b,c,d,e] = 'hello';
a // "h"
b // "e"
c // "l"

4、数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
在这里插入图片描述

5、函数参数的解构赋值

  1. 默认值: 在这里插入图片描述

6、圆括号问题

  • 解构赋值虽然很方便,但是在一些情况下不得使用括号:
  1. 变量声明语句中,模式不能带有圆括号。
// 报错
var [(a)] = 1;
var {
    
     x: (c) } = {
    
    };
  1. 函数参数中,模式不能带有圆括号
// 报错
function f([(z)]) 
{
    
    
	return z;
}
  1. 不能将整个模式,或嵌套模式中的一层,放在圆括号之中。

但是,此规则不容易辨别所以在模式中尽可能不要使用圆括号。

  • 可以使用圆括号的情况:赋值语句的非模式部分,可以使用圆括号
[(b)] = [3]; //正确
([ p: (d) } = {
    
    }); //正确

7、用途

1、交换变量的值:

[x,y] = [y,x]; //交换x、y的值

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

//返回一个数组:
function exam(){
    
    
	return [1,2,3];
var [a,b,c] = exam();
}
//返回一个对象:
function exam2(){
    
    
	return {
    
    
	foo:1;
	bar:2
	};
}
var {
    
     foo,bar } = exam2();

3、函数参数的定义:可以方便地将一组参数与变量名对应起来
在这里插入图片描述
4、提取JSON数据:

var jsonData = {
    
    
	id:42,
	status:"OK",
	data:[867,530]
}
let {
    
    id,status,number} = jsonData;
console.log(id,status,number)
//42,OK,[867,530]

5、函数参数的默认值
在这里插入图片描述
6、遍历Map结构:任何部署了Iterator接口的对象,都可以用 for…of 循环遍历。Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便。
在这里插入图片描述
7、输入模块的指定方法

const {
    
     Foo ,  Abr} = require("map");

参考文档

猜你喜欢

转载自blog.csdn.net/sanjun_done/article/details/103355346