• JavaScript 解构的 5 个有趣用途


    看看我的常规JavaScript代码,我发现解构赋值无处不在。

    读取对象属性和访问数组项是常见的操作。解构分配使这些操作变得更加容易和简洁。

    在这篇文章中,我将描述JavaScript中解构的5个有趣的用途,除了基本用法之外。

    1. 交换变量

    交换 2 个变量的常用方法需要一个额外的临时变量。让我们看一个简单的场景:

     
    
    let a = 1;
    let b = 2;
    let temp;
    temp = a;
    a = b;
    b = temp;
    a; // => 2
    b; // => 1

    temp是保存 值的临时变量。然后赋值为 ,因此赋值为 。aabbtemp

    解构赋值使变量交换变得简单,无需任何临时变量:

     
    
    let a = 1;
    let b = 2;
    [a, b] = [b, a];
    a; // => 2
    b; // => 1

    [a, b] = [b, a]是解构赋值。在右侧,将创建一个数组,即 。此数组的第一项分配给 ,第二项分配给 。[b, a][2, 1]2a1b

    尽管仍可创建临时数组,但使用解构赋值交换变量更简洁。

    这不是限制。您可以同时交换 2 个以上的变量。让我们试试:

     
    
    let zero = 2;
    let one = 1;
    let two = 0;
    [zero, one, two] = [two, one, zero];
    zero; // => 0
    one; // => 1
    two; // => 2

    您可以根据需要交换任意数量的变量!虽然,交换2个变量是最常见的情况。

    2. 访问数组项

    您有一个可能为空的项目数组。您希望访问数组的第一个、第二个或第 n 个项目,但如果该项目不存在,则获取默认值。

    通常,您将使用数组的 length 属性:

     
    
    const colors = [];
    let firstColor = 'white';
    if (colors.length > 0) {
    firstColor = colors[0];
    }
    firstColor; // => 'white'

    幸运的是,数组解构可以帮助您以同样更短的方式实现:

     
    
    const colors = [];
    const [firstColor = 'white'] = colors;
    firstColor; // => 'white'

    const [firstColor = 'white'] = colors解构将数组的第一个元素赋给变量。如果数组在索引处没有任何元素,则分配默认值。firstColorcolors0'white'

    但是灵活性要大得多。如果您只想访问第二个元素,那也是可能的:

     
    
    const colors = [];
    const [, secondColor = 'black'] = colors;
    secondColor; // => 'black'

    请注意解构左侧的逗号:这意味着忽略第一个元素。 与数组中的索引处的元素一起分配。secondColor1colors

    3. 不可变操作

    当我开始使用 React 和后来的 Redux 时,我被迫编写尊重不可变性的代码。虽然一开始遇到了一些困难,但后来我看到了它的好处:处理单向数据流更容易。

    不可变性禁止改变对象。幸运的是,解构可以帮助您以不可变的方式轻松实现某些操作。

    与 rest 运算符结合使用的析构从数组的开头删除元素:...

     
    
    const numbers = [1, 2, 3];
    const [, ...fooNumbers] = numbers;
    fooNumbers; // => [2, 3]
    numbers; // => [1, 2, 3]

    解构将创建一个新数组,其中包含除第一个数组之外的项。[, ...fooNumbers] = numbersfooNumbersnumbers

    numbers数组不会发生突变,使操作保持不可变。

    可以采用相同的不可变方式从对象中删除属性。让我们尝试从对象中删除属性:foobig

     
    
    const big = {
    foo: 'value Foo',
    bar: 'value Bar'
    };
    const { foo, ...small } = big;
    small; // => { bar: 'value Bar' }
    big; // => { foo: 'value Foo', bar: 'value Bar' }

    解构赋值与 object rest 运算符结合使用,将创建一个新对象,其中所有属性均来自 ,仅不带 。smallbigfoo

    4. 解构迭代

    ​​
    在前面的部分中,解构已应用于数组。但是,您可以取消构造实现可迭代协议的任何对象。
     

    许多本机基元类型和对象都是可迭代的:数组、字符串、类型化数组、集合和映射。

    例如,可以将字符串分解为字符:

     
    
    const str = 'cheese';
    const [firstChar = ''] = str;
    firstChar; // => 'c'

    您不仅限于本机类型。可以通过实现可迭代协议来自定义析构逻辑。

    movies包含影片对象的列表。在解构时,最好将电影标题作为字符串。让我们实现一个自定义迭代器:movies

     
    
    const movies = {
    list: [
    { title: 'Heat' },
    { title: 'Interstellar' }
    ],
    [Symbol.iterator]() {
    let index = 0;
    return {
    next: () => {
    if (index < this.list.length) {
    const value = this.list[index++].title;
    return { value, done: false };
    }
    return { done: true };
    }
    };
    }
    };
    const [firstMovieTitle] = movies;
    console.log(firstMovieTitle); // => 'Heat'

    movies对象通过定义方法实现可迭代协议。迭代器循环访问电影的标题。Symbol.iterator

    符合可迭代协议允许将对象解构为标题,特别是通过读取第一部电影的标题:。moviesconst [firstMovieTitle] = movies

    天空是使用迭代器进行解构时的极限。

    5. 解构动态属性

    根据我的经验,按属性对对象进行解构比数组解构更频繁。

    对象的解构看起来非常简单:

     
    
    const movie = { title: 'Heat' };
    const { title } = movie;
    title; // => 'Heat'

    const { title } = movie创建一个变量,并为其分配属性的值。titlemovie.title

    当第一次阅读有关对象析构的信息时,我有点惊讶,您不必静态地知道属性名称。您可以使用动态属性名称取消构造对象!

    为了了解动态解构的工作原理,让我们编写一个问候语函数:

     
    
    function greet(obj, nameProp) {
    const { [nameProp]: name = 'Unknown' } = obj;
    return `Hello, ${name}!`;
    }
    greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
    greet({ }, 'name'); // => 'Hello, Unknown!'

    greet()函数使用 2 个参数调用:对象和属性名称。

    在内部,解构赋值使用方形制动器读取动态属性名称。该变量接收动态属性值。greet()const { [nameProp]: name = 'Unknown' } = obj[nameProp]name

    更好的是,您可以指定一个默认值,以防该属性不存在。'Unknown'

    6. 结论

    如果要访问对象属性和数组项,则解构效果很好。

    除了基本用法之外,数组解构还便于交换变量,访问数组项,执行一些不可变的操作。

    JavaScript 提供了更大的可能性,因为您可以使用迭代器定义自定义解构逻辑。

  • 相关阅读:
    使用jdk自带的VisualVM分析hprof堆转储文件
    【配电网重构】负荷平衡的配电网重构【含Matlab源码 2180期】
    MySQL基础篇(三)-- 数据类型
    Vue中使用组件的三大步骤
    HarmonyOS-使用router事件跳转到指定UIAbility
    【AI】Genetic Algorithm 遗传算法
    代码的坏味道(二)——为什么建议使用模型来替换枚举?
    Seata 1.5.2 源码学习(Client端)
    植物大战 C++ ——基础特性
    杭州亚运会,一个中国TO B厂商的“新样板间”
  • 原文地址:https://blog.csdn.net/qq_22182989/article/details/125610728