ata
发布于 2022-07-29 / 0 阅读 / 0 评论 / 0 点赞

JS 的一个快速赋值语句

前几天写一个接口的时候,Copilot 给我自动生成了如下代码:

this.data[key] = { ...this.data[key], ...value }; // value 是 Object

以前从未见过的语法,令我大为震撼。当时只知道功能是把 value 中的各个键值浅拷贝到 this.data,不知道这具体是个什么机制。

今天试了一下,发现它的语法是:

object = { ...newObject };
array = [...newArray];

举例:

// -- 使用字符串(数组)作为来源 --
let a = { };
let key = 'test';
a = { ...key };
// { '0': 't', '1': 'e', '2': 's', '3': 't' }

// -- 使用 JSON 对象作为来源 --
let a = { a: 1 };
let valueObj = { key1: 1, key2: 2, key3: 3 }
a = { ...valueObj };
// { key1: 1, key2: 2, key3: 3 }

let a = { a: 1 };
let valueObj = { key1: 1, key2: 2, key3: 3 }
a = { ...a, ...valueObj }; // 把 a 和 valueObj 合并
// { a: 1, key1: 1, key2: 2, key3: 3 }

数组也可以作为源的,毕竟 JavaScript 里 Array 本质上也是 Object 。

数组里的这个语法就只支持数组了:

let a = [0, 0, 0];
let values = [1, 2, 3, 4];
a = [...a, ...values]; // 把 a 和 values 合并
// [0, 0, 0, 1, 2, 3, 4]

values = { a: 1, b: 2 };
a = [ ...a, ...values ];
// TypeError: values is not iterable

应用一下,写一个在数据中搜索特定用户的功能:

let results = [];

for (let index in pendingDb.data) {
    if (pendingDb.data[index].uid === uid) {
        results.push({ ...pendingDb.data[index], index });
    }
}

return results;

评论