基础-解构咯

68 阅读4分钟

ES6的解构都听说过,多多少少都用过,那就来记录记录解构到底怎么用才能6得飞起。

解构:使用es6的语法规则,将一个对象或数组的属性提取到某个变量中。

1. 对象的解构

const obj = {
  name: "zhangsan",
  age: 18,
  address:{
    city: 'hangzhou',
    country: 'china',
  }
};

比如上面的内容,以前我们要多次使用某个属性的时候,只能重新定义:

let name, age;
name = obj.name;
age = obj.age;

解构就是先定义同名变量,再把同名的属性拿出来。

let name, age;
({ name, age } = obj);

//语法糖
const { name, age, address } = obj;
console.log("name", name);

那比如说我解构一个sex属性,那会是啥情况?我们看他的规则哈,这是先定义,再取出,所以不会报错,这个sex的值就是undefined

有的时候,我们希望这个解构的属性有个默认值,那就在解构的时候直接赋值就可以了。

const { name, age, sex = "male" } = obj;

咳咳咳,那如果我们解构的属性和对象的属性不同名怎么办?赋值就好了。

//先声明 name ange gender 三个变量,然后从对象里把sex赋值给gender
const { name, age, sex:gender } = obj;

又要有默认值怎么办?照样子写呗。

const { name, age, sex: gender = "male" } = obj;

那如果要解构的比较深,比如city呢?

const {
  sex: gender = "male",
  address: { city },
} = obj;

这样就可以了,其实这是声明了两个变量namecity。把address.city给了city

2.数组的结构

了解了数组的本质后呢,数组的解构就很好入手了。数组的本质还是对象,数组的key就是下标嘛。 比如说这么一个数组。

const arr = [0, 2, 4, 5];

那就解呗,

const{0,1,2}=arr; error

这样? 不行啊,0,1,2不是一个合法的标识符,所以不能用作变量名字,那就重新定义呗。

const { 0: n1, 1: n2, 2: n3 } = arr; //success

上面用的是对象语法糖,标准解构语法应该是这样的:

PS: 这时候不是什么同名属性了,而是按顺序给变量赋值

let n1, n2, n3, n4;
[n1, n2, n3, n4] = arr;

所以,数组的解构语法糖是这样的:

const [n1, n2, n3] = arr;

那如果想拿第一项和第三项,则第二项留空就可以了。

const [n1, , n3] = arr;

那默认值是和对象一样,直接赋值就可以了。当然了,还可以拿嵌套的。

  • 嵌套数组。
const arr = [0, 2, 4, [1, "gg"]];

const [, , , [, n]] = arr;//第四项里的第二项
  • 嵌套对象。
const arr = [0, 2, 4, { a: "g", b: "rr" }];

const [, , , { b }] = arr;//第四项里的b属性

//当然还可以这么拿
const { b } = arr[3];

3.剩余项的解构

有这么个需求,我要把源对象的name拿出来,剩余的属性放到一个新对象了。

const user = {
  name: "zhangsan",
  age: 18,
  sex: "male",
  address: {
    city: "hangzhou",
    country: "china",
  },
};

const { name, ...obj } = user; //使用展开运算符

同样的,把数组的前两项解构出来,剩余项放到一个新数组里。

const arr = [1, 2, "b", "c"];

const [a, b, ...strs] = arr;

PS: 剩余项必须是后面的项

  • 例:
const article = {
  title: "文章标题",
  content: "文章内容",
  comments: [
    {
      content: " 评论1",
      user: {
        id: 1,
        name: "张三",
      },
    },
    {
      content: " 评论2",
      user: {
        id: 2,
        name: "李四",
      },
    },
  ],
};

有这个一组数据,要求解构出 第二条用户名和评论内容

//解法很多啊,只要知道数组和对象的解法,一层一层找
const {
  comments: [
    ,
    {
      content,
      user: { name },
    },
  ],
} = article;

const [
    ,
    {
      content,
      user: { name },
    },
  ] = article.comments;
  
  
const {
  content,
  user: { name },
} = article?.comments[1];

4.解构传参

这个解构经常是和函数配合哈,我们函数接受一个对象参数,经常是需要用到那个对象里的属性,那使用解构是最方便的。

function print(obj) {
  const {
    name,
    address: { city },
  } = user;
}

另外,比如在后端请求接口那里,我们需要传一个type或其他什么的,也有不传的时候,这时用解构就方便了。

function getData({ type = 1 } = {}) {
  const data = { type };
  console.log("data", data);
}
getData({ type: 4, name: "张三" });

这种就是我不管你传了多少,我挑出来我想要的,只用我想要的数据去发请求。这是在js里经常遇到的,多人开发的时候,对接口不熟悉或者对类型没过分要求时。但是在ts里不会出现乱传了,一般传的都是请求所需要的,在xx.d.ts声明文件里配好了。