自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

StructuredClone():JavaScript中深拷貝對(duì)象的最簡(jiǎn)單方法

開發(fā) 前端
我們總是不得不依賴第三方庫(kù)來進(jìn)行深度復(fù)制并保留循環(huán)引用?,F(xiàn)在,這一切都因新的structuredClone()而改變了——它是一種簡(jiǎn)單高效的方法,可以深度復(fù)制任何對(duì)象。

深拷貝是傳遞或存儲(chǔ)數(shù)據(jù)時(shí)的一項(xiàng)常規(guī)編程任務(wù)。

  • 淺拷貝:只復(fù)制對(duì)象的第一層
  • 深拷貝:復(fù)制對(duì)象的所有層級(jí)
const obj = { name: 'Tari', friends: [{ name: 'Messi' }] };

const shallowCopy = { ...obj };

const deepCopy = dCopy(obj);

console.log(obj.friends === shallowCopy.friends); // ? true

console.log(obj.friends === deepCopy.friends); // ? false

但一直以來,我們都沒有一種內(nèi)置的方法來完美地深度復(fù)制對(duì)象,這一直是一個(gè)痛點(diǎn)。

我們總是不得不依賴第三方庫(kù)來進(jìn)行深度復(fù)制并保留循環(huán)引用。

現(xiàn)在,這一切都因新的structuredClone()而改變了——它是一種簡(jiǎn)單高效的方法,可以深度復(fù)制任何對(duì)象。

const obj = { name: 'Tari', friends: [{ name: 'Messi' }] };

const clonedObj = structuredClone(obj);

console.log(obj.name === clonedObj); // false
console.log(obj.friends === clonedObj.friends); // false

輕松克隆循環(huán)引用:

const car = {
  make: 'Toyota',
};

// ?? 循環(huán)引用
car.basedOn = car;

const cloned = structuredClone(car);

console.log(car.basedOn === cloned.basedOn); // false

// ?? 循環(huán)引用被克隆
console.log(car === car.basedOn); // true

這是你永遠(yuǎn)無法用JSON stringify/parse技巧實(shí)現(xiàn)的:

想深入多少層都可以:

// ??
const obj = {
  a: {
    b: {
      c: {
        d: {
          e: 'Coding Beauty',
        },
      },
    },
  },
};

const clone = structuredClone(obj);

console.log(clone.a.b.c.d === obj.a.b.c.d); // false
console.log(clone.a.b.c.d.e); // Coding Beauty

你應(yīng)該知道的限制

structuredClone()非常強(qiáng)大,但它有一些你應(yīng)該了解的重要弱點(diǎn):

無法克隆函數(shù)或方法

這是因?yàn)樗褂玫奶厥馑惴ā?/p>

無法克隆DOM元素

<input id="text-field" />
const input = document.getElementById('text-field');

const inputClone = structuredClone(input);

console.log(inputClone);

不保留RegExp的lastIndex屬性

我是說,沒人會(huì)去克隆正則表達(dá)式,但這是值得注意的一點(diǎn):

const regex = /beauty/g;
const str = 'Coding Beauty: JS problems are solved at Coding Beauty';

console.log(regex.index);
console.log(regex.lastIndex); // 7

const regexClone = structuredClone(regex);
console.log(regexClone.lastIndex); // 0

其他限制

了解這些限制很重要,以避免使用該函數(shù)時(shí)出現(xiàn)意外行為。

部分克隆,部分移動(dòng)

這是一個(gè)更復(fù)雜的情況。

你將內(nèi)部對(duì)象從源對(duì)象轉(zhuǎn)移到克隆對(duì)象,而不是復(fù)制。

這意味著源對(duì)象中沒有留下任何可以改變的東西:

const uInt8Array = Uint8Array.from(
    { length: 1024 * 1024 * 16 },
    (v, i) => i
);

const transferred = structuredClone(uInt8Array, {
    transfer: [uInt8Array.buffer],
});

console.log(uInt8Array.byteLength); // 0

總的來說,structuredClone()是JavaScript開發(fā)者工具箱中的一個(gè)寶貴補(bǔ)充,使對(duì)象克隆比以往任何時(shí)候都更容易。

責(zé)任編輯:姜華 來源: 大遷世界
相關(guān)推薦

2024-05-08 08:32:25

架構(gòu)

2024-03-04 08:45:30

JavaScript深度拷貝對(duì)象

2023-05-08 09:00:46

JSON深拷貝對(duì)象

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2025-04-27 09:45:58

JavaScript深拷貝淺拷貝

2017-05-24 11:54:55

Javascript深拷貝

2020-10-12 08:35:22

JavaScript

2023-05-17 07:36:00

淺拷貝深拷貝對(duì)象

2018-09-26 14:37:17

JavaScript前端編程語(yǔ)言

2018-05-10 14:20:18

前端JavaScript深拷貝

2021-04-07 10:12:05

Javascript對(duì)象拷貝開發(fā)

2011-03-14 15:42:57

Oracle數(shù)據(jù)庫(kù)遷移復(fù)制

2021-04-09 10:58:51

UbuntuLinuxWindows 10

2020-07-16 15:20:37

MatplotlibPython可視化

2022-10-24 07:55:31

2013-07-16 14:44:43

Ubuntutftp服務(wù)器

2009-02-05 14:48:51

跳出循環(huán)多層循環(huán)編程

2025-04-27 10:02:50

JavaScript前端開發(fā)

2011-02-17 11:19:24

Linux Live

2009-05-19 17:28:44

深拷貝淺拷貝clone()
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)