JavaScript解构赋值的实用技巧指南

目录
  • 一、基本概念
  • 二、解构分类
    • 1. 对象的解构赋值
    • 2. 数组的解构赋值
      • (1)字符串
      • (2)数组
      • (3)集合
      • (4)Map
  • 三、嵌套解构
  • 四、使用技巧
    • 1. 函数解构
      • (1)解构函数参数
    • 2. 循环中的解构
    • 3. 动态属性解构
    • 4. 交换变量
    • 5. 数组拷贝
  • 四、解构赋值注意点
  • 总结

一、基本概念

为什么需要解构呢,先来看一个例子:

const student = {
    name: 'ZhangSan',
    age: 18,
    scores: {
        math: 19,
        english: 85,
        chinese: 100
    }
};

function displayInfo(student) {
    console.log('name:', student.name);
    console.log('math:', student.scores.math);
    console.log('english:', student.scores.english);
    console.log('chinese:', student.scores.chinese);
}

displayInfo(student);

这样写也能实现预期效果,但是代码看起来比较冗余。并且,如果对象内部嵌套较深时,那么对象的访问链就会变得很长。虽然这并不是什么大问题,但是使用解构赋值会让代码变得更简单和易读。 ​

下面就来看看什么是解构赋值。MDN 中对解构赋值的描述:

解构赋值语法是一种 Javascript 表达式。通过解构赋值, 可以将属性值从对象/数组中取出,赋值给其他变量。

实际上,结构赋值就是将复杂的结构分解为简单的部分。解构赋值语法可以用于变量声明或者变量赋值。除此之外,还可以使用嵌套的解构赋值语法来处理嵌套结构。 ​

比如,对上面例子中的对象进行解构:

function displayInfo(student) {
  const { name, scores: {math, english, chinese} } = student;
    console.log('name:', name);
    console.log('math:', math);
    console.log('english:', english);
    console.log('chinese:', chinese);
}

这样看起来是不是简洁多了。

二、解构分类

根据MDN对解构赋值的定义,我们可以将解构赋值分为两大类:

  • 对象解构
  • 数组解构

​下面就分别来看看这两种解构赋值。

1. 对象的解构赋值

对象解构又称为对象属性分配模式,它允许我们将对象的属性值分配给相应的变量。它有两种写法:

let obj =  {x: 1, y: 2, z: 3};

let {x: a, y: b, z: c} = obj;
console.log(a, b, c)

let {x, y, z} = obj;
console.log(x, y, z)
  • 第一种(第3行)是对象解构的完整形式,对象的每个属性都将被分配一个变量,其中冒号前面的是源对象中的属性,冒号后面的是要赋值属性;
  • 第二种(第5行)是对象解构的简写形式,对象的属性与要分配的属性一致时可以使用这种形式。

​如果需要给已有变量赋值,就需要额外注意了:

let obj =  {x: 1, y: 2, z: 3};

let x = 0, y = 0, z = 0;

({x, y, z} = obj)
console.log(x, y, z)

这里需要注意,需要将赋值表达式使用括号括起来,如果省略,解构对象将被视为一个块语句,而块语句时不能放在赋值表达式左侧的。 ​

当使用解构赋值时,可以给变量传递一个默认值:

const person = {
    name: 'ZhangSan',
    height: 180
};

const { name, height, age = 25 } = person;

console.log(name, height, age);

这里我们给age分配了一个默认值,当对源对象上不存在age属性时,age就会被赋上默认值25,而不是undefined。 ​

如果分配的对象属性为undefined,那么就会使用默认值:

const {x = 2} = {x: undefined};
console.log(x);    // 2

2. 数组的解构赋值

在使用数组解构时,实际上会使用迭代器将所需要的值与结构源分开。因此,我们可以对可迭代值使用数组结构,包括字符串、数组、集合、函数映射、DOM元素。我们还可以将解构赋值与扩展运算符结合使用。

(1)字符串

let message = 'Hello';
let [a, b] = message;
let [x, y, ...z] = message;

console.log(a, b);        // H e
console.log(x, y, z);     // H e ['l', 'l', 'o']

(2)数组

let numbers = [1, 2, 3];
let [x, y, z] = numbers;

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

(3)集合

let set = new Set().add('foo').add('bar');
let [a, b] = set;

console.log(a, b);      // foo bar

(4)Map

let map = new Map().set('a', 1).set('b', 2);
let [x, y] = map;

console.log(x, y);    // ["a", 1] ["b", 2]

在数组的解构中,存储变量的数组中的每个变量都会映射到解构数组上相同索引处的相应项。 ​

如果解构中某一项不需要,可以使用逗号操作符进行分隔:

const rgb = [200, 255, 100];

const [,, blue] = rgb;

console.log(blue);   // 100

与对象解构一样,可以使用数组解构为局部变量设置默认值:

const rgb = [200];

const [red = 255, green, blue = 255] = rgb;

console.log(`R: ${red}, G: ${green}, B: ${blue}`);

如果变量已经存在,就可以这么写:

let red = 100, green = 200, blue = 50;

const rgb = [200, 255, 100];

[red, green] = rgb;

console.log(`R: ${red}, G: ${green}, B: ${blue}`);

与对象解构不同的是,这里不需要括号将数组括起来。 ​

如果给变量分配的值是undefined,那么就会使用默认值:

const [x = 1] = [undefined];
console.log(x);    // 1

这里的默认值并不一定是一个固定值,它可以是一个计算属性:

function foo() {
    return 1;
}

let obj1 = {x: 2};
let obj2 = {x: undefined};

let {x=foo()} = obj1;
console.log(x);     // 2

let {x=foo()} = obj2;
console.log(x);     // 1

如果我们想将数组中的一些元素分配给变量,而将数组中的其余项分配给特定的变量就可以这样做:

let [greeting,...intro] = ["Hello", "I" , "am", "CUGGZ"];

console.log(greeting);  // "Hello"
console.log(intro);     // ["I", "am", "CUGGZ"]

三、嵌套解构

上面我们说的解构的知识普通的数组和对象。实际上,解构赋值可以用于嵌套数组和嵌套对象。比如,文章最开始的例子中,就是解构的嵌套对象:

const student = {
    name: 'ZhangSan',
    age: 18,
    scores: {
        math: 19,
        english: 85,
        chinese: 100
    }
};

const { name, scores: {math, english, chinese} } = student; 

再来看一个嵌套数组解构的例子:

let numbers = [1, [2, 3, 4], 5];
let [a, [b, c, d], e] = numbers;
console.log(a, b, c, d, e); // 1 2 3 4 5

四、使用技巧

1. 函数解构

(1)解构函数参数

可以对函数参数使用解构赋值:

function foo([a, b]) {
    console.log(a + b);
}
foo([1, 2]);       // 3

function bar({x, y}) {
    console.log(x, y);
}
foo({x: 1, y: 2}); // 1 2

可以对函数返回值使用解构赋值:

function getStudentInfo() {
    return {
        name: 'ZhangSan',
        age: 18,
        scores: {
            math: 19,
            english: 85,
            chinese: 100
        }
    };
}
const { name, scores: {math, english, chinese} } = getStudentInfo();
console.log(name, math, english, chinese);

2. 循环中的解构

当我们需要循环中的对象键值时,也可以使用对象解构:

const students = [
    {
        'name': 'ZhangSan',
        'grade': 80
    },
    {
        'name': 'LiSi',
        'grade': 75
    },
    {
        'name': 'WangWu',
        'grade': 95
    }
];

for(let {name, grade} of students){
    console.log(name, grade);
}

3. 动态属性解构

很多时候我们不知道对象属性的key,只有运行时才知道。比如有一个方法getStudentInfo,它以一个key为参数,并返回相应的属性值:

getStudentInfo('name');
getStudentInfo('age'); 

这里传递给getStudentInfo方法的参数是动态的,因此可以这样写:

const getStudentInfo = key => {
  const {[key]: value} = student;
  return value;
}

需要注意,包裹key的方括号不能少,否则会出现undefined值。

4. 交换变量

数组结构一个很实用的功能就是实现交换局部变量。通常,我们会借助临时变量来实现变量的交换:

let width = 300;
let height = 400;

let temp = width;
width = height;
height = temp;

console.log(width, height)

如果使用数组的解构赋值,就会变得很简单:

let width = 300;
let height = 400;

[width, height] = [height, width];

console.log(width, height)

5. 数组拷贝

可以使用解构赋值和rest运算符来实现数组的拷贝:

const rgb = [200, 255, 100];

const [...newRgb] = rgb;
// 等同于 const newRgb = [...rgb]

console.log(newRgb)

四、解构赋值注意点

为了防止从数组中取出一个值为undefined的对象,可以在表达式左边的数组中为任意对象预设默认值。

意思是:定义这个变量或者变量的值设置为 undefined的时候,而null、 '' 、false 在变量解析的过程中都是有值得情况,所以我们默认赋值会不成功。

示例如下:

const {a = '1', b = '2', c = '3', d = '4', e = '5'} = {a: 'a', b: null, c: undefined, d: false, e: ''}
console.log(a); //a
console.log(b); //null
console.log(c); //3
console.log(d); //false
console.log(e); // ""

如果只是根据属性的存在与否来绑定默认值的时候,可以使用解构赋值。

总结

到此这篇关于JavaScript解构赋值的文章就介绍到这了,更多相关JavaScript解构赋值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Javascript中的解构赋值语法详解

    前言 首先在 ES6中引入的"解构赋值语法"允许把数组和对象中的值插入到不同的变量中.虽然看上去可能很难,但实际上很容易学习和使用. 解构赋值语法是一种 JS表达式.ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量. 在ES6解构赋值出现之前,我们需要为变量赋值的时候,只能直接指定值. 比如: let a = 1; let b = 2; let c = 3; let d = 4; let e

  • 解析JavaScript的ES6版本中的解构赋值

    什么是解构赋值? 解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性值赋给一系列变量.这个语法非常简洁,而且比传统的属性访问更加清晰. 在不使用解构赋值的情况下,访问数组的前三项: var first = someArray[0]; var second = someArray[1]; var third = someArray[2]; var first = someArray[0]; var second = someArray[1]; var third = someArray

  • 详解JS ES6变量的解构赋值

    1.什么是解构? ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.它在语法上比ES5所提供的更加简洁.紧凑.清晰.它不仅能减少你的代码量,还能从根本上改变你的编码方式. 2.数组解构 以前,为变量赋值,我们只能直接指定值,比如 let a = 1; let b = 2; let c = 3; 现在可以用数组解构的方式来进行赋值 let [a, b, c] = [1, 2, 3]; console.log(a, b, c); // 1, 2, 3 这是数组解构最基本类型

  • Javascript 解构赋值详情

    目录 1.数组解构 2.对象解构 3.不完全解构 4.用解构赋值实现变量交换 1.数组解构 let [a, b, c] = [1,2,3] console.log(a, b, c) // 1 2 3 除了数组,任何可迭代的对象都支持被解构, 例如字符串 let [first, second] = "he" console.log(first, second) // h e 2.对象解构 赋值右侧是对象,左侧是包含在花括号内逗号隔开的变量名 let {a, b, c} = {a:1, b

  • JavaScript之解构赋值的理解

    1. ES6的新特性 允许将对象或者数组'分解'成多个单独的值, 以对象的解构开始. 代码示例 2. 说明 1).  定义一个对象 const obj={b:2,c:3,d:4}; 此时系统中没有变量b, 变量c与变量d 2). 开始解构该对象, const {a,b,c} = obj 这句话的意思是, 定义a,b,c三个变量, 然后在obj对象中寻找a,b,c变量, 如果找到, 则赋值给对应的变量 所以, a, 已定义, 但是未赋值. 定义是在const{a,b,c}中定义的, 而没有在obj

  • JavaScript解构赋值的实用技巧指南

    目录 一.基本概念 二.解构分类 1. 对象的解构赋值 2. 数组的解构赋值 (1)字符串 (2)数组 (3)集合 (4)Map 三.嵌套解构 四.使用技巧 1. 函数解构 (1)解构函数参数 2. 循环中的解构 3. 动态属性解构 4. 交换变量 5. 数组拷贝 四.解构赋值注意点 总结 一.基本概念 为什么需要解构呢,先来看一个例子: const student = { name: 'ZhangSan', age: 18, scores: { math: 19, english: 85, c

  • JavaScript解构赋值的5个常见场景与实例教程

    目录 前言 1. 提取数据 2. 别名取值 3. 动态属性 4. 对象解构中的 Rest 5. 默认值 总结 前言 解构赋值语法是一种 JavaScript 表达式,通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量.这种语法是 ECMAscript 6 规范引入了一种新语法,可以更轻松地从数组和对象中获取值. 1. 提取数据 先来看看如何在 JavaScript 中解构对象,可以从这个商品对象的简单示例开始. const product = { id: 1, title: "Ni

  • ES6下javascript解构赋值常见用法总结

    Javascript解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b Javascript解构赋值问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量占用多一行,代码行数和重复的声明a,使得代码不够简洁,能否通过左边变量名,匹配到右边的属性名从而取得对应的值,ES6解构语法核心就基于这样的模式匹配思想 上面的问题解构方案: let obj = { a: 1, b: 2 } // 取值 let {a,

  • JavaScript解构赋值详解

    目录 概念 数组解构 声明分别赋值 解构默认值 交换变量值 解构函数返回的数组 忽略返回值(或跳过某一项) 赋值数组剩余值给一个变量 嵌套数组解构 字符串解构 对象解构 基础对象解构 赋值给新变量名 解构默认值 赋值给新对象名的同时提供默认值 同时使用数组和对象解构 不完全解构 赋值剩余值给一个对象 嵌套对象解构(可忽略解构) 注意事项 小心使用已声明变量进行解构 函数参数的解构赋值 解构的用途 交换变量的值 从函数返回多个值 提取JSON数据 总结 概念 ES6提供了更简洁的赋值模式,从数组和

  • 一篇文章带你了解JavaScript的解构赋值

    目录 1. 什么是解构赋值 ? 2. 数组的解构赋值 2.1) 数组解构赋值的默认值 2.2) 数组解构赋值的应用 类数组中的应用 交换变量的值 3. 对象的解构赋值 3.1) 对象解构赋值的默认值 3.2)对一个已声明的变量解构赋值 4. 字符串的解构赋值 总结 1. 什么是解构赋值 ? 将属性/值从对象/数组中取出,赋值给其他变量 通俗来说,即解析某一数据的结构,将我们想要的东西提取出来,赋值给变量或常量. 让我们通过一个例子看看: const [a, b, c] = [1, 2, 3];

  • ES6解构赋值实例详解

    本文实例讲述了ES6解构赋值.分享给大家供大家参考,具体如下: 基本用法 let [x, y, ...z] = ['a'] //"a", undefined, [] 1.等号右边如果不是数组,将会报错(不是可遍历结构) 2.解构赋值 var, let, const命令声明均适用 3.set结构也可解构赋值(具有Iterator接口,可采用数组形式结构赋值) set解构:任何类型的单个值的集合 let [x, y, z] = new Set(["a", "b

  • es6中的解构赋值、扩展运算符和rest参数使用详解

    前言 本文主要给大家介绍了关于es6中解构赋值.扩展运算符和rest参数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. es6中较为常用的书写风格 为了书写的方便,es6中提出了很多比较友好的书写方式,其中最为常见的属于以下几个: 字符串模板 `abcdef${test}` 解构赋值 let [a, b, c] = [1, 2, 3] 扩展运算符 rest参数 ... 本文希望能够学习其中的主要的用法,方便书写和简洁性. 字符串模板 在以前的日子,我们经常捡到各

随机推荐